Los mismos números aleatorios en cada iteración de bucle

Tengo un ciclo for que se ejecuta 15 veces, con dh.setDoors() en cada iteración.

Lo que hace setDoors es llamar a srand(time(0)) , luego cada vez que se necesite un número aleatorio usará, por ejemplo, carSetter = rand()%3+1 . Alternativamente, puede usar decider = rand()%2+1 .

Ahora, normalmente, carSetter y carSetter se usan de formas diferentes, pero sospeché un problema y lo hice imprimir carSetter y carSetter en cada iteración. Esto es lo que salió:

 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... 

Los valores ‘1’ y ‘2’ cambian cuando lo ejecuto varias veces, pero siguen siendo los mismos durante las 15 veces.

Dado que el ciclo se ejecuta 15 veces diferentes, ¿no deberían carSetter y carSetter imprimir un número aleatorio diferente en cada iteración?

Cuando no tengo srand(time(0)) , funciona como se esperaba, pero no hay un conjunto de semillas, por lo que es la misma secuencia de números “aleatorios” cada vez, entonces ¿es probable que sea un problema con la semilla?

Cuando llamas a srand(x) , el valor de x determina la secuencia de números pseudoaleatorios devueltos en las siguientes llamadas a rand() , dependiendo por completo del valor de x .

Cuando estás en un bucle y llamas a srand() en la parte superior:

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

luego se genera la misma secuencia de números aleatorios según el valor que devuelve el time(0) . Como las computadoras son rápidas y su bucle probablemente se ejecute en menos de un segundo, el time(0) devuelve el mismo valor cada vez que pasa el ciclo. Entonces, y serán los mismos en cada iteración.

En cambio, solo necesita llamar a srand() una vez al inicio de su progtwig:

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

En el caso anterior, y tendrán diferentes valores cada vez que pase el ciclo.

Como dijo Kerrek, la siembra se realiza solo una vez, al comienzo del progtwig. Después de un srand, llama al rand tantas veces como quieras.

Cada vez que invocas srand(time(0)) , estás sembrando el generador de números pseudoaleatorios, dándole una nueva secuencia pseudoaleatoria de números. La secuencia es diferente dependiendo de cuál sea el argumento de srand , y en este caso usa el time(0) entonces, suponiendo que llame a su progtwig a lo sumo una vez por segundo, siempre obtendrá una nueva secuencia. Cuando llamas a rand() , obtienes el siguiente número en esta secuencia.

Sin embargo, dado que ha decidido llamar a srand varias veces en su progtwig, y ​​debido a que su progtwig es rápido (es decir, el time(0) no cambia), todo lo que hace es reiniciar repetidamente el PRNG en la misma secuencia. Es por eso que siempre obtienes los mismos valores: sigues resembrando el PRNG para que sea la misma secuencia, y esto también mueve el cursor al comienzo de la secuencia.

Semilla una vez Una vez.

srand ejecutar srand al principio de su progtwig, por ejemplo, en la función main .

Cuando ejecuta srand(time(0)) en la parte superior de la función en la que está usando rand() , es probable que le dé la misma semilla cada vez. time(0) da el tiempo en segundos, por lo que deberá evitar llamar a setDoors dos veces dentro del mismo segundo para obtener diferentes números cada vez. Si llama a setDoors dos veces dentro del mismo segundo, la semilla aleatoria será la misma, y ​​las llamadas subsiguientes a rand() generarán la misma secuencia de números pseudoaleatorios.