Numeri Random c++
salve ho bisogno di un suggerimento! devo generare dei numeri random appartenenti a due intevalli non contigui tra di loro ad esempio intervallo [1 10] e [30 65] ho pensato di fare una srand che ha come valore minimo 1 e valore max il 65 e poi verificare se viene generato un numero che non appartiene a uno dei due intervalli ripetere la random ! giusto ? o c è qualche altro modo ?GRAZIE

Risposte
Funziona ma non è il metodo più efficiente per farlo. C'è una probabilità non nulla di metterci tanto a trovare un numero che sia in quegli intervalli. L'idea normalmente adottata è quella di generare un numero tra 1 e 46. Se il numero è compreso tra 1 e 10, allora si restituisce il numero. In caso contrario si somma al numero 19 (30 - 11) e si restituisce il risultato.
Oppure prendi casualmente un valore booleano e in un caso estrai un numero tra 1 e 10, nell'altro tra 30 e 65 ;D
@mark97: ma questo farebbe variare la distribuzione da cui stai campionando.. La distribuzione non è più uniforme usando il tuo algoritmo..
Ancora non ho fatto probabilità (la faremo tra un paio di settimane), ma alla fine che un numero dell'insieme A:[1-10] e del'insieme B:[30-65] hanno la stessa probabilità di uscire, quindi alla fine non è uguale? Oppure il mio ragionamento è fallacie?
Il tuo metodo è composto da due passi. In un primo passo scegli l'intervallo in modo uniforme. Ogni intervallo avrà il 50% di essere scelto. Se viene scelto il primo intervallo, ogni numero in 1-10 avrà una probabilità di 1/10 di essere scelto nel secondo passo. Se invece viene scelto il secondo intervallo, ci sarà una probabilità di 1/36 di scegliere ognuno dei valori in 30-65 al secondo passo. Per cui avrai alla fine che i numeri tra 1 e 10 avranno una probabilità del 5% di essere scelti, mentre i numeri da 30 a 65 avranno una probabilità di circa 1.4%.
Volendo fare un esempio preso dalla vita comune. Supponi di avere una caraffa piena d'acqua e 46 bicchieri da riempire divisi in due gruppi, il primo da 10 bicchieri e il secondo da 36. Il tuo metodo equivale a dividere la caraffa a metà e quindi distribuire ogni metà ai due gruppi. E' ovvio che il gruppo formato da soli 10 bicchieri avrà più acqua in ogni bicchiere rispetto a quello di 35 bicchieri. Il mio metodo invece consiste nel riunire tutti i bicchieri e versare ad ogni bicchiere la stessa quantità. Il metodo originale invece è equivalente a prendere dei bicchieri ulteriori che non verranno usati e dividere l'acqua su tutti i bicchieri. A questo punto si prende l'acqua dai bicchieri in più e la si rimette nella caraffa per ricominciare a versare di nuovo su tutti i bicchieri. Il risultato sarà quello di avere la stessa acqua in ogni bicchiere, ma il processo è potenzialmente infinito. Spero sia chiaro.
Volendo fare un esempio preso dalla vita comune. Supponi di avere una caraffa piena d'acqua e 46 bicchieri da riempire divisi in due gruppi, il primo da 10 bicchieri e il secondo da 36. Il tuo metodo equivale a dividere la caraffa a metà e quindi distribuire ogni metà ai due gruppi. E' ovvio che il gruppo formato da soli 10 bicchieri avrà più acqua in ogni bicchiere rispetto a quello di 35 bicchieri. Il mio metodo invece consiste nel riunire tutti i bicchieri e versare ad ogni bicchiere la stessa quantità. Il metodo originale invece è equivalente a prendere dei bicchieri ulteriori che non verranno usati e dividere l'acqua su tutti i bicchieri. A questo punto si prende l'acqua dai bicchieri in più e la si rimette nella caraffa per ricominciare a versare di nuovo su tutti i bicchieri. Il risultato sarà quello di avere la stessa acqua in ogni bicchiere, ma il processo è potenzialmente infinito. Spero sia chiaro.
Sei stato chiarissimo, grazie
