¿Cómo generar un número aleatorio entre 0 y 1?

Quiero generar números aleatorios entre (0,1). Estoy intentando lo siguiente:

double r2() { return((rand() % 10000) / 10000.0); } int SA() { double u; u = r2(); } 

Pero no genera el resultado esperado. ¿Cómo puedo arreglarlo?

En su versión, rand() % 10000 producirá un número entero entre 0 y 9999 . Dado que RAND_MAX puede ser tan poco como 32767, y como esto no es exactamente divisible por 10000 y no es grande en relación a 10000, habrá un sesgo significativo en la “aleatoriedad” del resultado, además, el valor máximo será 0.9999, no 1.0 , y ha restringido innecesariamente sus valores a cuatro decimales.

Es simple aritmética, un número aleatorio dividido por el máximo número aleatorio posible dará un número de 0 a 1 inclusive, mientras se utiliza la resolución y distribución completas del RNG

 double r2() { return (double)rand() / (double)RAND_MAX ; } 

Utilice (double)rand() / (double)((unsigned)RAND_MAX + 1) si la exclusión de 1.0 fue intencional.

Aquí hay un procedimiento general para producir un número aleatorio en un rango específico:

 int randInRange(int min, int max) { return min + (int) (rand() / (double) (RAND_MAX + 1) * (max - min + 1)); } 

Dependiendo del algoritmo PRNG que se esté utilizando, el operador % puede dar como resultado una secuencia de números no aleatoria.

Me parece que no has llamado a srand primero. Ejemplo de uso aquí .

Establecer la semilla utilizando srand (). Además, no está especificando el valor máximo en rand (), por lo que está utilizando RAND_MAX. No estoy seguro de si en realidad son 10000 … ¿por qué no especificarlo? Aunque, no sabemos cuáles son sus “resultados esperados”. Es un generador de números aleatorios. ¿Qué estás esperando y qué estás viendo?

Como se señaló en otro comentario, SA () no está devolviendo nada explícitamente.

http://pubs.opengroup.org/onlinepubs/009695399/functions/rand.html http://www.thinkage.ca/english/gcos/expl/c/lib/rand.html

Edición: ¿De generar un número aleatorio entre [-1, 1] en C? ((float)rand())/RAND_MAX devuelve un número de punto flotante en [0,1]

Ha intentado con: reemplazar ((rand ()% 10000) / 10000.0), con: (rand ()% 2). Esto funcionó para mí!

Así que podrías hacer algo como esto:

 double r2() { srand(time(NULL)); return(rand() % 2); }