2010-07-01 17 views
5

Alla ricerca di un filo generatore casuale sicuro ho trovato una classe generatore di Mersenne Twister che l'autore dice che se thread-safe:Discussione sicuro Mersenne Twister

http://www.umiacs.umd.edu/~yangcj/mtrnd.html

Ma dopo aver studiato il codice non riesco a vedere erano è sicuro filo. Non ci sono serrature di alcun tipo o qualcosa che assomigli a una variabile di blocco.

Questa implementazione è davvero sicura? Se sì, qual è la magia?

risposta

1

Sembra thread-safe nel senso che due oggetti MersenneTwist diversi possono essere utilizzati contemporaneamente. Non è possibile utilizzare lo stesso oggetto in due thread senza proteggerlo con un blocco.

Immagino che la versione C originale l'autore parli di variabili globali o statiche utilizzate, quindi è un miglioramento.

+0

La mia applicazione richiede di produrre numeri casuali ma univoci tra tutti i thread. Utilizzando un oggetto Mersenne Twist diverso per thread posso garantire l'unicità dei numeri generati? – Horacio

+0

La generazione di numeri univoci è una domanda diversa. Inoltre, otterrete la stessa sequenza a meno che non assegniate a ciascun oggetto un seme diverso. – Amnon

+0

Finché utilizzo lo stesso oggetto mersenne otterrò numeri casuali univoci finché la sequenza non si ripeterà correttamente? E per il mersenne twister il ciclo si ripete dopo un lungo periodo, molto più grande di quello che potrebbe richiedere la mia app, quindi penso di poter usare questo generatore casuale anche come generatore di id unico. Correggimi se sbagli, per favore – Horacio

6

Esiste una discussione su come creare un generatore di numeri casuali Mersenne Twister a flusso multiplo su Multiple stream Mersenne Twister e anche un'implementazione (ad esempio, codice sorgente in Fortran 95) a http://theo.phys.sci.hiroshima-u.ac.jp/~ishikawa/PRNG/mt_stream_en.html. Il metodo avvia più flussi in punti della sequenza Mersenne Twister che sono ampiamente separati, garantendo che i flussi multipli siano indipendenti l'uno dall'altro e non producano la stessa sequenza di numeri casuali. Non ci sono necessità di serrature e quindi potenziali colli di bottiglia in codice parallelo; i flussi separati sono accessibili da id.