Расхождение в состоянии `numpy.random` исчезает
Существует два запуска Python одного и того же проекта с разными настройками, но с одинаковыми случайными начальными числами.
Проект содержит функцию, которая возвращает пару случайных чисел, используя numpy.random.uniform
,
Независимо от другого использования numpy.random
в процессе python серии вызовов функций в обоих прогонах генерируют одинаковые последовательности до некоторой точки.
И после генерации разных результатов за один раз в этот момент они генерируют одни и те же последовательности снова, в течение некоторого периода.
Я не пробовал использовать numpy.random.RandomState
пока, но как это возможно?
Это просто совпадение, что где-то что-то использует numpy.random
вызвал несоответствие и исправил это снова?
Мне любопытно, если это единственная возможность или есть другое объяснение.
Заранее спасибо.
ДОБАВИТЬ: Я забыл упомянуть, что в этот момент посева не было.
1 ответ
Когда вы используете random
модуль в numpy, каждое случайно сгенерированное число (независимо от распределения / функции) использует один и тот же "глобальный" экземпляр RandomState
, Когда вы устанавливаете семена с помощью numpy.random.seed()
Вы устанавливаете семя "глобального" экземпляра RandomState
, Это тот же принцип, что и random
Библиотека в Python.
Я не уверен в конкретной реализации этих случайных функций, но я подозреваю, что каждая случайная функция заставит базовый Mersenne Twister продвинуться на несколько "шагов", причем количество шагов не обязательно будет одинаковым для разных random
функции.
Таким образом, если порядок каждого звонка random
функция не одинакова между отдельными прогонами, тогда вы можете увидеть расхождение в сгенерированной последовательности случайных чисел, снова сходимость, если "шаги" Мерсенна Твистера снова выстроятся в линию.
Вы можете обойти это, инициализируя отдельный RandomState
экземпляр для каждой функции, которую вы используете. Например:
import numpy as np
seed = 12345
r_uniform = np.random.RandomState(seed)
r_randint = np.random.RandomState(seed)
a_random_uniform_number = r_uniform.uniform()
a_random_int = r_randint.randint(10)
Возможно, вы захотите установить разные семена для каждого экземпляра - это будет зависеть от того, для чего вы используете эти псевдослучайные числа.