2011-01-31 15 views
5

Estoy buscando generar valores aleatorios enteros grandes, no negativos en un sistema POSIX. He encontrado 2 posibles funciones que se ajustan a la factura, y sus respectivos inicializadores:Números aleatorios en la API POSIX C

 #include <stdlib.h> 

     long int random(void);  
     void srandom(unsigned int seed); 
CONFORMING TO 
     4.3BSD, POSIX.1-2001. 

     // and 

     long int lrand48(void); 
     void srand48(long int seedval);  
CONFORMING TO 
     SVr4, POSIX.1-2001. 
  1. Qué funciones se prefieren (rosca a la seguridad y la gama de valores generada)?
  2. Teniendo en cuenta que la seguridad no es una preocupación, ¿cómo debo sembrarlos?
  3. ¿Deben diferir los métodos de siembra debido a los diferentes argumentos para las funciones de inicialización (long int vs. unsigned int)?
+0

si tiene un sistema POSIX puede también use '/ dev/urandom' o'/dev/random' –

Respuesta

3

Use nrand48, tiene el mismo rango que lrand48 y recibe un puntero a una matriz utilizada como semilla. hacer este hilo local garantizará la seguridad del hilo. (como nota al margen, parece que la implementación de glibc puede tener algunos problemas, consulte http://evanjones.ca/random-thread-safe.html para obtener más información, esta página también contiene un buen resumen de las funciones de generación de números aleatorios de subprocesos)

+0

+1 para señalar a [nrand48] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/erand48.html) y la nota lateral sobre sus posibles problemas – jschmier

+0

¿Puede explicar por qué 'nrand48' es mejor que' random'? –

+2

AFAICT, 'random' no es intrínsecamente seguro para subprocesos (la implementación glibc es, ya que bloquea su estado interno, pero esto puede no ser cierto para todas las implementaciones POSIX). glibc ofrece 'random_r', que es seguro para hilos, pero no es portátil. lo único que 'nrand48' mejora es la seguridad de la secuencia, lo que le permite obtener flujos de números aleatorios independientes. los rangos son similares ('random' es' 2^31 - 1', 'nrand48' es' 2^31'), el período para 'random' puede ser más largo. La línea de fondo, en mi humilde opinión, es utilizar 'nrand48' si necesita seguridad hilo,' azar 'de lo contrario. – Hasturkun

Cuestiones relacionadas