Stessi numeri casuali ogni iterazione del ciclo

Ho un ciclo for che viene eseguito 15 volte, con dh.setDoors() in ogni iterazione.

Ciò che setDoors fa è chiamare srand(time(0)) , quindi ogni volta che è necessario un numero casuale verrà utilizzato, ad esempio, carSetter = rand()%3+1 . In alternativa, può utilizzare decider = rand()%2+1 .

Ora, normalmente decider e carSetter vengono utilizzati in modi diversi, ma ho il sospetto che si sia verificato un problema e ho stampato print carSetter e decider ad ogni iterazione. Ecco cosa è venuto fuori:

 Door 1 has car Decider is 2 Door 1 has car Decider is 2 Door 1 has car Decider is 2 Door 1 has car Decider is 2 Door 1 has car Decider is 2 etc... 

I valori ‘1’ e ‘2’ cambiano quando lo eseguo più volte, ma sono sempre gli stessi per 15 volte.

Dal momento che il ciclo è in esecuzione 15 volte diverse, non è necessario che carSetter e carSetter stampino un numero casuale diverso ogni iterazione?

Quando non ho srand(time(0)) , funziona come previsto, ma non c’è un seed set, quindi è la stessa sequenza di numeri “casuali” ogni volta, quindi è probabilmente un problema con il seed?

Quando chiamate srand(x) , il valore di x determina la sequenza di numeri pseudo casuali restituiti nelle seguenti chiamate a rand() , a seconda del valore di x .

Quando sei in un ciclo e chiama srand() in alto:

 while (...) { srand(time(0)); x = rand(); y = rand(); } 

quindi viene generata la stessa sequenza di numeri casuali in base al valore restituito time(0) . Dato che i computer sono veloci e il tuo loop probabilmente viene eseguito in meno di un secondo, time(0) restituisce lo stesso valore ogni volta attraverso il loop. Quindi y sarà uguale a ogni iterazione.

Invece, di solito devi solo chiamare srand() una volta all’inizio del tuo programma:

 srand(time(0)); while (...) { x = rand(); y = rand(); } 

Nel caso precedente, y avranno valori diversi ogni volta attraverso il ciclo.

Come ha detto Kerrek, la semina viene eseguita una sola volta, all’inizio del programma. Dopo una chiamata srand rand tutte le volte che vuoi.

Ogni volta che invochi srand(time(0)) , srand(time(0)) generatore di numeri pseudo-casuali, infondendogli una nuova sequenza pseudo-casuale di numeri. La sequenza è diversa a seconda di cosa sia l’argomento di srand , e in questo caso si usa il time(0) , quindi, supponendo che si chiami al massimo una volta al secondo, si otterrà sempre una nuova sequenza. Quando chiami rand() , ottieni il numero successivo in questa sequenza.

Tuttavia, dal momento che hai deciso di chiamare più volte srand nel tuo programma, e poiché il tuo programma è veloce (cioè il time(0) non sta cambiando), tutto ciò che fai è reimpostare ripetutamente il PRNG nella stessa sequenza. Questo è il motivo per cui ottieni sempre gli stessi valori: continui a ricomporre il PRNG per essere la stessa sequenza, e questo sposta anche il cursore all’inizio della sequenza.

Seme una volta Una volta.

È necessario eseguire srand all’inizio del programma, ad esempio nella funzione main .

Quando si esegue srand(time(0)) nella parte superiore della funzione in cui si utilizza rand() , è probabile che si dia lo stesso seed ogni volta. time(0) indica il tempo in secondi, quindi è necessario evitare di chiamare setDoors due volte entro lo stesso secondo per ottenere numeri diversi ogni volta. Se si chiama setDoors due volte entro lo stesso secondo, il seme casuale sarà lo stesso, e le successive chiamate a rand() genereranno la stessa sequenza di numeri pseudocasuali.