2010-03-07 24 views
15

¿Cómo puedo generar un número aleatorio entre 0 y 1?c - generador de números aleatorios

+5

¿Verdaderamente aleatorio o pseudoaleatorio? – tvanfosson

+2

¿cuál es la diferencia? – tm1

+0

@ tm1: los números pseudoaleatorios solo se aproximan a las propiedades de los números aleatorios y no serán necesariamente adecuados para las aplicaciones que requieren aleatoriedad real, como la criptografía. Consulte http://en.wikipedia.org/wiki/Pseudorandom_number_generator para obtener una explicación. – tvanfosson

Respuesta

22

Puede generar un número pseudoaleatorio usando stdlib.h. Sólo tiene que incluir stdlib, a continuación, llamar

double random_number = rand()/(double)RAND_MAX; 
+2

Como referencia, esto dará valores en [0.0, 1.0] es decir, que incluyen tanto 0.0 como 1.0. –

+3

Y lo más importante, lo más probable es que no sea justo (!) Hay muchas implementaciones donde el conjunto [0.0, 1.0] contiene más de RAND_MAX elementos. (_En C, el conjunto [0.0, 1.0] es un conjunto finito contable_) – MSalters

+0

@MSalters, ¿eso es un problema interesante, cualquier idea sobre una solución? –

9

Suponiendo PO quiere 0 o 1:

srand(time(NULL)); 
foo = rand() & 1; 

Editar inspirado por el comentario: viejos rand() implementaciones tenían un defecto - bits de orden inferior tuvieron períodos mucho más cortos que bits de orden superior por lo que el uso del bit de orden inferior para tales implementaciones no es bueno. Si sabe que su aplicación rand() adolece de este defecto, utilizar bit de orden superior, como esto:

foo = rand() >> (sizeof(int)*8-1) 

asumiendo regulares arquitecturas de 8 bits por byte

+0

Esto funciona perfectamente, gracias. – tm1

+1

debe cambiar el resultado de 'rand()' para tener en cuenta los problemas con los generadores congruenciales lineales – Christoph

+0

@Christoph Gracias, he editado mi publicación para reflejar su punto. – qrdl

8

man 3 drand48 es exactamente lo que pidió para.

El drand48() y erand48() funciones devuelven no negativo, de doble precisión, los valores de punto flotante, distribuida de manera uniforme en el intervalo [0,0, 1,0].

Se encuentran en #include <stdlib.h> en plataformas UNIX. Sin embargo, no están en ANSI C, por lo que (por ejemplo) no los encontrará en Windows a menos que traiga su propia implementación (por ejemplo, LibGW32C).

Cuestiones relacionadas