2010-07-01 20 views
5

Buscando un generador aleatorio seguro para hilos encontré una clase de generador de Mersenne Twister que el autor dice que si el hilo de seguridad:Tema mersenne segura tornado

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

Pero después de estudiar el código no puedo ver eran es seguro hilo. No hay bloqueos de ningún tipo ni nada que se parezca a una variable de bloqueo allí.

¿Es esta implementación realmente segura para subprocesos? Si es así, ¿cuál es la magia?

Respuesta

1

Parece ser seguro para subprocesos en el sentido de que se pueden utilizar dos objetos diferentes MersenneTwist al mismo tiempo. No puede usar el mismo objeto en dos subprocesos sin protegerlo con un bloqueo.

Supongo que la versión C original del autor habla sobre las variables globales o estáticas utilizadas, por lo que es una mejora.

+0

Mi aplicación requiere producir números aleatorios pero únicos entre todos los hilos. Al usar un objeto Mersenne Twist diferente por hilo, ¿puedo garantizar la exclusividad de los números generados? – Horacio

+0

Generar números únicos es una pregunta diferente. Además, obtendrá la misma secuencia a menos que le dé a cada objeto una semilla diferente. – Amnon

+0

Siempre que use el mismo objeto mersenne obtendré números aleatorios únicos hasta que la secuencia se repita ¿verdad? Y para el twister de mersenne, el ciclo se repite después de un largo período, mucho más grande de lo que mi aplicación puede necesitar, así que creo que puedo usar este generador aleatorio también como generador único de id. Corrígeme si está mal, por favor. – Horacio

6

Hay una discusión sobre cómo hacer un generador de números aleatorios Mersenne Twister de múltiples flujos en Multiple stream Mersenne Twister, y también una implementación (es decir, código fuente en Fortran 95) en http://theo.phys.sci.hiroshima-u.ac.jp/~ishikawa/PRNG/mt_stream_en.html. El método inicia múltiples flujos en puntos en la secuencia de Mersenne Twister que están ampliamente separados, lo que garantiza que las múltiples secuencias sean independientes entre sí y no produzcan la misma secuencia de números aleatorios. No hay necesidad de cerraduras y, por lo tanto, cuellos de botella potenciales en código paralelo; las secuencias separadas son accedidas por id.