Расхождение в состоянии `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)

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

Другие вопросы по тегам