2012-10-13 171 views
5

Así que tengo múltiples hilos que usarán la función rand_r. La firma de esta función es:Sembrando correctamente el método rand_r (int * val)

int rand_r(int *val); 

yo estaba tratando de utilizar el tiempo para sembrar esta función pero estoy teniendo todo tipo de problemas. ¿Alguien podría explicarme cómo llamaría rand_r usando el tiempo, o alguna otra forma simple de sembrar rand_r dinámicamente?

Gracias!

+0

consulte el manual-> http://linux.die.net/man/3/rand_r – MByD

+0

¿Qué es todo tipo de problemas? Por favor sea específico para que podamos ayudar. –

+0

Hola @Thomas Intenté usar todas las formas de esto. Y estoy teniendo muchos problemas con los punteros, supongo. Intenté hacer: rand_r ((unsigned int *) time (null)) y no obtuve un problema de compilación, pero obtuve una falla de segmentación al ejecutar. – user1742385

Respuesta

9

Para la versión reentrante rand_r, la semilla es solo el valor inicial del estado. Necesita una semilla por hilo. O bien crear una matriz de semillas, o hacer que la semilla local de subprocesos variables:

_Thread_local unsigned int seed = time(NULL); 

int do_stuff() 
{ 
    for (; ;) 
    { 
     int n = rand_r(&seed); 
     // use n 
    } 
} 
+1

+1 para usar una nueva y brillante característica C11 '_Thread_local'. Quizás deberíamos agregar que no todos los compiladores soportan eso directamente, pero quizás tienen una extensión similar, que el soporte de subprocesos en C11 es opcional, y que el uso indicado es incluir "hilos.h" y usar la macro más bonita 'thread_local ', en cambio. –

0

En un sistema UNIX/POSIX puede abrir /dev/urandom de números aleatorios iniciales, la lectura de bytes suficientes para obtener una semilla para cada hilo. Microsoft Windows tiene una forma más elaborada de obtener esos números. Consulte CryptGenRandom para obtener más información. Como estos se basan en la entropía del sistema, no son para números aleatorios de gran volumen.

Cuestiones relacionadas