2012-02-12 8 views
5

Tengo un bucle for que se ejecuta 15 veces, con dh.setDoors() en cada iteración.Los mismos números aleatorios cada iteración de bucle

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

Ahora, normalmente decider y carSetter se utilizan de diferentes maneras, pero sospechaba un problema y lo hizo imprimir carSetter y decider 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' cambio al ejecutarlo varias veces, pero siguen siendo los mismos a lo largo de las 15 veces.

Dado que el ciclo se ejecuta 15 veces diferentes, ¿no deberían carSetter y decider 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?

+9

La siembra se debe hacer * una vez *, nunca. Lea sobre cómo funcionan los generadores de números pseudoaleatorios, y probablemente sea bueno aprender también alguna teoría de probabilidades mientras lo hace. –

+0

Solo estoy usando srand una vez en setDoors, setDoors solo se repite 15 veces. ¿El problema es que srand se repite 15 veces? – GlassZee

+0

Sería más fácil describir la solución cuando * publique su código real *. –

Respuesta

12

Cuando se llama a srand(x), entonces el valor de x determina la secuencia de números pseudo-aleatorios devueltos en siguientes llamadas a rand(), dependiendo enteramente del valor de x.

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

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

entonces se genera la secuencia misma de números aleatorios en función del valor que time(0) devoluciones. Dado que las computadoras son rápidas y su bucle probablemente se ejecute en menos de un segundo, time(0) devuelve el mismo valor cada vez que pasa el ciclo. Por lo tanto, x y y serán las mismas en cada iteración.

su lugar, por lo general sólo necesita llamar a srand() una vez al comienzo de su programa:

srand(time(0)); 

while (...) { 
    x = rand(); 
    y = rand(); 
} 

En el caso anterior, x y y tendrán diferentes valores cada vez a través del bucle.

+0

* Ponte mis zapatos azules de psuedo ... * –

1

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

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

2

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

1

Cada vez que se invoca srand(time(0)), estás siembra el generador de números pseudo-aleatorios, lo que le confiere una nueva secuencia pseudo-aleatoria de números. La secuencia es diferente dependiendo de cuál sea el argumento srand, y en este caso usa time(0), por lo que, suponiendo que llame a su programa a lo sumo una vez por segundo, siempre obtendrá una nueva secuencia. Cuando llamas al rand(), obtienes el siguiente número en esta secuencia.

Sin embargo, como ha decidido llamar al srand varias veces en su programa, y ​​debido a que su programa es rápido (es decir, 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.

semillas una vez. Una vez.

Cuestiones relacionadas