Лучший способ вернуться к случайному семени после временного исправления? - PullRequest
0 голосов
/ 27 сентября 2018

Это единственный способ «отменить» генератор случайных чисел:

np.random.seed(int(time.time()))

Если у вас есть код, который вы хотите повторить (например, тест) в цикле с другим кодом, который выхотите, чтобы каждый цикл был случайным, как «сбросить» начальное число на генератор случайных чисел после его установки?

Следующий код иллюстрирует проблему:

import numpy as np

def test():
    np.random.seed(2)
    print("Repeatable test:", [np.random.randint(10) for i in range(3)])

for i in range(4):
    print("Random number:", np.random.randint(10))
    test()

Random number: 8
Repeatable test: [8, 8, 6]
Random number: 2
Repeatable test: [8, 8, 6]
Random number: 2
Repeatable test: [8, 8, 6]
Random number: 2
Repeatable test: [8, 8, 6]

Желаемый результат: Я хочуслучайное число, чтобы быть случайным в каждом цикле.

Я рад импортировать модуль времени, если это единственный способ сделать это, но я подумал, что может быть более простой, более надежный способ.

(Вы не можете получить текущее начальное число согласно этой записи )

1 Ответ

0 голосов
/ 28 сентября 2018

Вы идете по неверному пути.Вместо того, чтобы пытаться отключить глобальный ГСЧ, используемый numpy.random, используйте отдельный ГСЧ для частей, которые должны повторяться.Этот ГСЧ может иметь полностью независимое состояние от numpy.random ГСЧ по умолчанию:

def test():
    rng = numpy.random.RandomState(2)
    print("Repeatable test:", [rng.randint(10) for i in range(3)])

Хотя технически возможно сохранить и восстановить состояние глобального numpy.random ГСЧ, этоочень специализированная операция и редко хорошая идея.Это может быть полезно, например, если вы отлаживаете часть кода и хотите «перемотать» случайное состояние после перехода назад по коду, хотя вам нужно заранее сохранить состояние, и оно не будет перематываться назадлюбые другие генераторы случайных чисел:

# Don't abuse this.
state = numpy.random.get_state()
do_stuff()
numpy.random.set_state(state)
...