2009-11-23 18 views
7

Cada vez que ejecuto este código, obtengo el mismo resultado.¿Por qué obtengo el mismo resultado con rand() cada vez que compilo y corro?

Programa

#include<stdlib.h> 

int main(int agrc, const char *argv[]) { 
int i = rand(); 
printf("%d\n",i); 
for(i=0;i<10;i++) { 
    printf("%d\n",rand()); 
} 
} 

Resultado:

41 
18467 
6334 
26500 
19169 
15724 
11478 
29358 
26962 
24464 
5705 

me encontré con esto en mingw. En realidad estoy aprendiendo Objective-C

Por favor, ayúdame.

+5

obligatorio referencia xkcd: http://xkcd.com/221/ – Skizz

+0

http://stackoverflow.com/questions/1694827/random-float-number-help – Lucas

+1

Personalmente, me gusta tomar un montón de números aleatorios primera Por la mañana, de random.org para tener algo a mano cuando necesito un número aleatorio realmente bueno. Me gusta hacer lo mismo con los GUID también. – Skizz

Respuesta

34

Necesita sembrar la función rand con un número único antes de poder usarla. El método más sencillo es utilizar time()

Por ejemplo

srand(time(NULL)); 
rand();//now returns a random number 

La razón es que los números aleatorios proporcionados por rand() (o cualquier otra función basada algoritmo) no son al azar. La función rand simplemente toma su estado numérico actual, aplica una transformación, guarda el resultado de la transformación como el nuevo estado y devuelve el nuevo estado.

Para que rand devuelva diferentes números pseudoaleatorios, primero debe establecer el estado de rand() en algo único.

+9

Para agregar a esta respuesta, cada número de semilla (tiempo() en este caso) creará una lista diferente de números aleatorios. Pero, si la semilla # es la misma, la lista será la misma. – Poindexter

+6

La función 'time' toma un puntero a un objeto' time_t'. Do 'srand (time (NULL));' en su lugar. Y tenga en cuenta que varias llamadas a 'time (NULL)' dentro del mismo segundo devuelven el mismo valor. – pmg

3

Sólo para añadir a la respuesta de Yacoby - Yo estaba un poco sorprendido de que no por defecto a una semilla basada en el tiempo, así que busqué la man page:

Si no se proporciona ningún valor de la semilla, el rand() la función se siembra automáticamente con un valor de 1.

Así que si cambia el código para utilizar seed(1) que aún debe consultar la misma salida - pero seed(time()) hará que cambie cada vez.

+2

Se establece de forma predeterminada en una semilla fija para que pueda, si es necesario, obtener resultados reproducibles de su (s) programa (s) (por ejemplo, durante la prueba, depuración, yaddah, yaddah). –

2

La salida de rand es seudo RANDOM, lo que significa que se ve efectivamente al azar, pero se calcula de la misma manera cada vez, a partir de un valor especial llamado la semilla. Con el mismo valor inicial, obtienes la misma secuencia de números aleatorios.

Para establecer una semilla diferente, use la función C estándar void srand (unsigned int) una vez en su código antes de comenzar a generar números aleatorios. Una forma común de obtener una secuencia diferente de números aleatorios cada vez que ejecuta el programa es basar la semilla en la hora del reloj. P.ej. srand (reloj())

8

Quiere inicializar el PRNG.

Inicialízalo una vez (normalmente dentro de main()) con una llamada a la función srand().

Si no inicializa el PRNG, lo predeterminado es tenerlo inicializado con el valor 1. Por supuesto, inicializarlo con algún otro valor constante no le dará diferentes números pseudoaleatorios para diferentes ejecuciones del programa.

srand(1); /* same as default */ 
srand(42); /* no gain, compared to the line above */ 

Debe inicializar con un valor que cambie con cada ejecución del programa. El valor devuelto por la función time() es el valor más utilizado.

srand(time(NULL)); /* different pseudo random numbers almost every run */ 

El problema con time(NULL) es que devuelve el mismo valor en el mismo segundo. Por lo tanto, si llamas a tu programa dos veces a las 11:35:17 del mismo día, obtendrás los mismos números pseudoaleatorios.

+1

+1 para agregar que llamar a srand (tiempo (NULL)) varias veces en el mismo segundo producirá el mismo resultado. –

Cuestiones relacionadas