Этот вопрос в первую очередь связан с практической проблемой разработки программного обеспечения, но мне было бы любопытно услышать, могли бы теоретики дать более глубокое понимание этого.
Проще говоря, у меня есть симуляция Монте-Карло, которая использует генератор псевдослучайных чисел, и я хотел бы распараллелить ее так, чтобы 1000 компьютеров параллельно выполняли одну и ту же симуляцию. Поэтому мне нужно 1000 независимых потоков псевдослучайных чисел.
Можем ли мы иметь 1000 параллельных потоков со следующими свойствами? Здесь должен быть очень известным и широко изученным PRNG со всеми видами хороших теоретических и эмпирических свойств.
Потоки, вероятно, так же хороши, как если бы я просто использовал и разделил поток, сгенерированный X, на 1000 потоков.
Генерация следующего числа в любом потоке (почти) так быстро , как генерации следующего номера с .
Иначе говоря: можем ли мы получить несколько независимых потоков «бесплатно»?
Конечно, если бы мы просто использовали , всегда отбрасывая 999 чисел и выбирая 1, то у нас наверняка было бы свойство 1, но мы потеряли бы во время выполнения в 1000 раз.
Простая идея состоит в том, чтобы использовать 1000 копий с начальными числами 1, 2, ..., 1000. Это, безусловно, будет быстрым, но не очевидно, если потоки имеют хорошие статистические свойства.
После некоторого поиска в Google я обнаружил, например, следующее:
Библиотека SPRNG, похоже, предназначена именно для этой цели и поддерживает несколько PRNG .
В наше время Mersenne Twister, кажется, является популярным PRNG, и я нашел несколько ссылок на вариант, который может генерировать несколько потоков параллельно.
Но все это так далеко от моих собственных областей исследований, что я не мог понять, что на самом деле является современным, и какие конструкции хорошо работают не только в теории, но и на практике.
Некоторые уточнения: мне не нужны никакие криптографические свойства; это для научных расчетов. Мне понадобятся миллиарды случайных чисел, поэтому мы можем забыть любой генератор с периодом .
Редактировать: я не могу использовать настоящий ГСЧ; Мне нужен детерминистический PRNG. Во-первых, это очень помогает при отладке и делает все воспроизводимым. Во-вторых, это позволяет мне, например, очень эффективно находить медиану, используя тот факт, что я могу использовать многоходовую модель (см. Этот вопрос ).
Редактировать 2: Есть тесно связанный вопрос @ StackOverflow: генератор псевдослучайных чисел для кластерной среды .