Управление numpy случайным начальным числом с переменными вызовами случайного размера - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть симуляция, которая требует генерации N случайных чисел на каждой итерации. Однако N варьируется в зависимости от состояния симуляции. Поскольку N меняется, после вызовов numpy.random() дают разные результаты. Однако я бы хотел, чтобы следующие вызовы numpy.random() не влияли на N.

. Я решил эту проблему путем (1) генерации большого случайного целого числа перед вызовом numpy.random() и затем (2 ) установить случайное начальное число как целое число после вызова numpy.random() (см. ниже). Однако это кажется неуклюжим.

Есть ли лучший способ управления состоянием numpy .random, на который не влияет аргумент size?

import numpy as np
N=10
# set seed
np.random.seed(0)
# generate N numbers
a = np.random.normal(size=N)
# check its state
print(np.random.randint(1e4))

Этот вызов randint() возвращает 2599

# set seed
N = 1
np.random.seed(0)
# generate N numbers
b = np.random.normal(size=N)
# check its state
print(np.random.randint(1e4))

Этот вызов randint() возвращает 4859

Потенциальное решение:

N = 10
# set seed
np.random.seed(0)
# generate a large random integer
rand_int = np.random.randint(1e6)
# generate N numbers
b = np.random.normal(size=N)
# reset the seed
np.random.seed(rand_int)
# check its state
print(np.random.randint(1e4))

Этот вызов randint() возвращает 5143 независимо от N

1 Ответ

3 голосов
/ 26 февраля 2020

numpy.random.* функции используют один глобальный экземпляр PRNG (генератор псевдослучайных чисел), который используется во всем приложении. В ваших примерах кода np.random.normal продвигает этот PRNG разное количество раз, так что следующий вызов randint выводит другое псевдослучайное число.

Вместо этого, если разные части вашего моделирования требуют различного потока случайные числа, вместо того чтобы полагаться на глобальный экземпляр PRNG numpy.random.*, используют два или более экземпляров PRNG, каждый из которых инициализируется на основе общего начального числа.

NumPy 1.17 вводит новое случайное число Система генерации и включает в себя несколько объектов для этой цели. К ним относятся класс SeedSequence для генерации нескольких состояний PRNG с использованием общего начального числа и класс Generator, который содержит PRNG. Новая система была результатом предложения об изменении политики RNG , в котором говорится, что функции numpy.random.*, как правило, больше не должны использоваться. Это особенно связано с тем, что numpy.random.* работает в глобальном состоянии.

Документация NumPy теперь содержит подробную информацию о заполнении нескольких PRNG в новой системе. См. Также « Заполнение нескольких процессов », из моей статьи о PRNG.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...