rand () sembrando con el tiempo () problema

Tengo dificultades para averiguar cómo usar rand () y sembrarlo con time () con Xcode. Quiero generar números decimales aleatorios entre 0 y 1.

El código me da números aparentemente aleatorios para los elementos 1 y 2, pero el elemento 0 siempre está en algún lugar alrededor de 0.077. ¿Alguna idea de por qué esto sería?

Mi código es:

#include  #include  #include  int main(void) { double array[3]; double rand_max = RAND_MAX; srand((int)time(NULL)); for (int iii = 0; iii < 3; iii++) array[iii] = rand() / rand_max; for (int iii = 0; iii < 3; iii++) printf("Element %d is: %lf.\n", iii, array[iii]); return(0); } 

La salida para varias ejecuciones fue la siguiente:

 [Session started at 2010-09-11 21:19:07 -0500.] Element 0 is: 0.076918. Element 1 is: 0.753664. Element 2 is: 0.824467. The Debugger has exited with status 0. [Session started at 2010-09-11 21:19:12 -0500.] Element 0 is: 0.076957. Element 1 is: 0.411353. Element 2 is: 0.602494. The Debugger has exited with status 0. [Session started at 2010-09-11 21:19:16 -0500.] Element 0 is: 0.076988. Element 1 is: 0.937504. Element 2 is: 0.624915. The Debugger has exited with status 0. [Session started at 2010-09-11 21:19:24 -0500.] Element 0 is: 0.077051. Element 1 is: 0.989806. Element 2 is: 0.669757. 

Las implementaciones típicas de rand simplemente no son muy buenas. Podría tirar los primeros resultados, o podría cambiar a un mejor generador de números pseudoaleatorios. También vea: Necesito un generador de números aleatorios. de la comp.lang.c FAQ.

intenta aleatorizar el generador aleatorio sin lanzarlo en

 /* initialize random seed: */ srand ( time(NULL) ); 

Holly Molly … esta no es fácil. Recuerdo que hace mucho tiempo en mis modelos estocásticos tuve este problema. La solución fue usar algún pragma derective, por lo que recuerdo.

De todos modos abajo está la solución y funciona. Números aleatorios cada vez … aunque de alguna manera.

 #include  #include  #include  int main(void) { double array[10]; double rand_max = RAND_MAX; srand(time(NULL)); for (int iii = 0; iii < 9; iii++){ rand(); array[iii] = rand() / rand_max; } for (int iii = 0; iii < 9; iii++){ printf("Element %d is: %lf.\n", iii, array[iii]); } return(0); } 

rand () es generalmente un generador lineal congruente. Sospecho que es rand-fbsd.c . time () tampoco es una muy buena semilla, ya que solo unos pocos bits inferiores cambian significativamente en poco tiempo.

random () es un poco mejor También considere sembrar usando sranddev () o srandomdev ().