2012-10-13 8 views
5

Quindi ho più thread che utilizzeranno la funzione rand_r. La firma di questa funzione è:Sezionare correttamente il metodo rand_r (int * val)

int rand_r(int *val); 

stavo cercando di utilizzare il tempo per seminare questa funzione, ma sto avendo tutti i tipi di problemi. Qualcuno potrebbe spiegarmi come chiamerei rand_r usando il tempo, o qualche altro modo semplice per seminare rand_r in modo dinamico.

Grazie!

+0

fare riferimento al manuale-> http://linux.die.net/man/3/rand_r – MByD

+0

Quali sono tutti i tipi di problemi? Si prega di essere specifici in modo che possiamo aiutare. –

+0

Ciao @Thomas ho provato a usare tutte le forme di questo. E sto avendo un sacco di problemi con i puntatori, immagino. Ho provato a fare: rand_r ((unsigned int *) time (null)) e non ho ottenuto la compilazione di un problema, ma ho riscontrato un errore di segmentazione durante l'esecuzione. – user1742385

risposta

9

Per la versione rientrante rand_r, il seme è solo il valore iniziale dello stato. È necessario un seme per thread. O creare un array di semi, o fare il seme variabile thread-locale:

_Thread_local unsigned int seed = time(NULL); 

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

+1 per usare una funzione C11 nuovissima e brillante '_Thread_local'. Si dovrebbe forse aggiungere che non tutti i compilatori lo supportano direttamente, tuttavia, ma forse hanno un'estensione simile, che il supporto per i thread in C11 è opzionale e che l'uso indicato è quello di includere "threads.h" e usare la macro più bella 'thread_local ', invece. –

0

Su un sistema UNIX/POSIX è possibile aprire /dev/urandom per i numeri casuali iniziali, lettura abbastanza byte per ottenere un seme per ciascun thread. Microsoft Windows ha un modo più elaborato per ottenere tali numeri. Cercare CryptGenRandom per i dettagli. Poiché si basano sull'entropia del sistema, non si tratta di numeri casuali ad alto volume.

Problemi correlati