В моей программе мне нужно запустить N отдельных потоков, каждый с собственным RNG, который используется для выборки большого набора данных. Мне нужно иметь возможность заполнить весь этот процесс одним значением, чтобы я мог воспроизвести результаты.
Достаточно ли просто последовательно увеличивать начальное число для каждого индекса?
В настоящее время я использую numpy
's, RandomState
который использует генератор псевдослучайных чисел Mersenne Twister.
Фрагмент кода ниже:
# If a random number generator seed exists
if self.random_generator_seed:
# Create a new random number generator for this instance based on its
# own index
self.random_generator_seed += instance_index
self.random_number_generator = RandomState(self.random_generator_seed)
По сути, я начинаю с введенного пользователем начального числа (если оно существует) и для каждого экземпляра / потока последовательно добавляю индекс (от 0 до N-1) запущенного экземпляра. Я не знаю, является ли это хорошей практикой или есть лучший способ сделать это.
Ответы:
Это не очень хорошая практика, конечно. Например, рассмотрим, что происходит, когда вы выполняете два запуска с корневыми начальными числами 12345 и 12346. Каждый запуск будет иметь
N-1
общие потоки.Реализации Mersenne Twister (включая
numpy.random
иrandom
) обычно используют другой PRNG для расширения целочисленного начального числа в большой вектор состояния (624 32-разрядных целых числа), которые использует MT; это массив изRandomState.get_state()
. Хороший способ сделать то, что вы хотите, - запустить PRNG, один раз заполнить его входным целым числом и получить из негоN*624
32-разрядные целые числа. Разделите этот поток наN
векторы состояний и используйтеRandomState.set_state()
для явной инициализации каждогоRandomState
экземпляра. Возможно, вам придется обратиться к источникам Cnumpy.random
или_random
из стандартной библиотеки, чтобы получить этот PRNG (они одинаковые). Я не уверен, что кто-то реализовал отдельную версию этого PRNG для Python.источник
RandomState
реализаций в разработке, которая использует алгоритм, который имеет настраиваемые потоки. То есть вы инициализируете каждыйRandomState
экземпляр одним и тем же начальным числом и разными идентификаторами потоков (просто увеличиться - это нормально), и вам гарантированы независимые потоки. pypi.python.org/pypi/randomstateисточник
Теперь есть пакет Python под названием RandomGen , у которого есть методы для достижения этой цели.
Он поддерживает независимые потоки, созданные из одного начального числа, а также протокол перехода для более старых генераторов случайных чисел, таких как MT19937.
источник
Некоторые люди утверждают, что есть корреляции в случайных числах, генерируемых последовательными семенами. /programming/10900852/near-seeds-in-random-number-generation-may-give-s Similar-random-numbers Я не уверен, насколько это правда.
Если вы беспокоитесь об этом, почему бы не использовать один генератор случайных чисел, чтобы выбрать семена для всех других генераторов?
источник