Случайные числа для нескольких потоков

проблема

Я намереваюсь написать приложение на C ++ 11 для Linux, которое выполняет некоторое численное моделирование (не криптографию) на основе приблизительно одного миллиона псевдослучайных 32-битных чисел. Чтобы ускорить процесс, яЯ хотел бы выполнять симуляцию в параллельных потоках, используя все ядра настольного процессора. Я'Я хотел бы использовать Mersenne Twistermt19937 обеспечивается в качестве PRNG, и я полагаю, что по соображениям производительности у меня должен быть один такой PRNG на поток. Сейчас я'Я не уверен, как их заполнить, чтобы избежать генерации одной и той же подпоследовательности случайных чисел в нескольких потоках.

альтернативы

Вот альтернативы, о которых я думал до сих пор:

Посеять PRNG для каждого потока независимо от .I '/dev/urandom

Я немного обеспокоен случаем, когда пул энтропии системы исчерпан, так как я нене знаю, как работает система внутреннего PRNG. Может ли это случиться так, что я случайно получу последовательные семена, которые точно идентифицируют последовательные состояния Twister Мерсенна, из-за того, что/dev/urandom использует сам Mersenne Twister? Вероятно, сильно связано с моей озабоченностью по следующему пункту.

Семя одно PRNG из/dev/urandom и остальные из этого первого.

По сути, это то же самое: хорошо или плохо использовать один PRNG для посева другого, использующего тот же алгоритм? Или, другими словами, чтение 625 32-битных целых чисел изmt19937 соответствуют непосредственно внутреннему состояниюmt19937 генератор в любой момент во время этого поколения?

Обсудите других с самого начала с информацией, не относящейся к Мерсенну.

Поскольку использование одного и того же алгоритма для генерации случайных чисел и для создания начального начального числа кажется каким-то образом плохой идеей, я подумал о введении некоторого элемента, который не зависит от алгоритма Мерсенна Твистера. Например, я мог бы XOR идентифицировать поток в каждом элементе начального начального вектора. Делает ли это что-то лучше?

Поделиться одним PRNG среди потоков.

Это позволило бы убедиться, что существует только одна последовательность со всеми известными и желаемыми свойствами твистера Мерсенна. Но издержки блокировки, необходимые для управления доступом к этому генератору, меня несколько волнуют. Поскольку я не нашел никаких доказательств обратного, я предполагаю, что я, как пользователь библиотеки, буду отвечать за предотвращение одновременного доступа к PRNG.

Предварительно сгенерируйте все случайные числа.

Это позволит одному потоку сгенерировать все необходимые 1М случайные числа заранее, чтобы потом использовать их в разных потоках. Требуемый объем памяти 4M будет небольшим по сравнению с общим приложением. В этом подходе меня больше всего беспокоит то, что генерация случайных чисел сама по себе не является параллельной. Весь этот подход также неслишком хорошо масштабируется.

Вопросы

Какой из этих подходов вы бы предложили и почему? Или у вас есть другое предложение?

Знаете ли вы, какие из моих опасений оправданы, а какие просто связаны с тем, что я не понимаю, как все работает на самом деле?

Ответы на вопрос(8)

Ваш ответ на вопрос