2010-07-01 5 views
5

Ищете потокобезопасная генератора случайных чисел я нашел класс генератора Вихрь Мерсенна, что автор говорит, если Потокобезопасная:Потокобезопасная Вихрь Мерсенна

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

Но после изучения кода я не могу видеть, было это безопасно нить. В нем нет никаких замков или что-либо похожее на переменную блокировки.

Является ли эта реализация действительно надежной? Если да, то что такое магия?

ответ

1

Он кажется потокобезопасным в том смысле, что одновременно могут использоваться два разных объекта MersenneTwist. Вы не можете использовать один и тот же объект в двух потоках, не защищая его блокировкой.

Я предполагаю, что исходная версия C говорит об используемых глобальных или статических переменных, поэтому это улучшение.

+0

Мое приложение требует создания случайных, но уникальных номеров среди всех потоков. Используя другой объект Mersenne Twist для каждого потока, я могу гарантировать уникальность сгенерированных чисел? – Horacio

+0

Создание уникальных номеров - это другой вопрос. Кроме того, вы получите одну и ту же последовательность, если вы не дадите каждому объекту другое семя. – Amnon

+0

До тех пор, пока я использую тот же объект mersenne, я получу уникальные случайные числа, пока последовательность не повторится правильно? И для mersenne twister цикл повторяется после долгого периода, намного большего, чем то, что может понадобиться моему приложению, поэтому я могу использовать этот случайный генератор также как уникальный генератор идентификаторов. Исправьте меня, если вы ошибаетесь. – Horacio

6

Существует обсуждение того, как создать генератор случайных чисел с несколькими потоками Mersenne Twister в Multiple stream Mersenne Twister, а также реализацию (то есть исходный код в Fortran 95) в http://theo.phys.sci.hiroshima-u.ac.jp/~ishikawa/PRNG/mt_stream_en.html. Метод запускает несколько потоков в точках последовательности Mersenne Twister, которые широко разделены, гарантируя, что множественные потоки независимы друг от друга и не будут генерировать одну и ту же последовательность случайных чисел. Нет необходимости в замках и, следовательно, потенциальные шеи бутылки в параллельном коде; к отдельным потокам обращается идентификатор.