2015-08-23 4 views
23

Следующие импортирует NumPy и устанавливает семя.Как я могу получить текущее семя генератора случайных чисел NumPy?

import numpy as np 
np.random.seed(42) 

Однако, я не заинтересован в установке семени, но больше в его чтении. random.get_state(), похоже, не содержит семена. documentation не дает явного ответа.

Как извлечь текущее семя, используемое numpy.random, если я не установил его вручную?

Я хочу использовать текущее семя для переноса на следующую итерацию процесса.

+1

Не могли бы вы объяснить, что вы подразумеваете под * «использовать текущее семя для переноса на следующую итерацию процесса» *? Есть ли причина, по которой вы не можете просто использовать комбинацию 'np.random.get_state' и' np.random.set_state', или же передать экземпляр 'np.random.RandomState' для отслеживания внутренних состояние ГСЧ? –

+0

@ali_m Если я исправил семя, я знаю, какое семя использовать для воспроизведения результата. Однако, если я не зафиксировал семя, как я могу узнать, какое семя используется? – Mast

+1

Почему ответ на ваш вопрос сказал: «Короткий ответ: вы просто не можете (по крайней мере, не в общем случае)». Однако вы приняли ответ. Удалось ли ему ответить на ваш вопрос или нет? Я запутался. –

ответ

31

Короткий ответ: вы просто не можете (по крайней мере, не вообще).

Mersenne Twister ГСЧ, используемый NumPy имеет 2 -1 возможные внутренние состояния, в то время как один 64-битное целое имеет только 2 возможные значения. Поэтому невозможно сопоставить каждое состояние RNG с уникальным целым семенем.

Вы можете получить и установить внутреннее состояние ГСЧ непосредственно с помощью np.random.get_state и np.random.set_state. Вывод get_state является кортежем, вторым элементом которого является массив из (624,) из 32-битных целых чисел. Этот массив имеет более чем достаточно бит для представления каждого возможного внутреннего состояния RNG (2 624 * 32> 2 -1).

Кортеж, возвращенный get_state, может использоваться как семена, чтобы создать воспроизводимые последовательности случайных чисел. Например:

import numpy as np 

# randomly initialize the RNG from some platform-dependent source of entropy 
np.random.seed(None) 

# get the initial state of the RNG 
st0 = np.random.get_state() 

# draw some random numbers 
print(np.random.randint(0, 100, 10)) 
# [ 8 76 76 33 77 26 3 1 68 21] 

# set the state back to what it was originally 
np.random.set_state(st0) 

# draw again 
print(np.random.randint(0, 100, 10)) 
# [ 8 76 76 33 77 26 3 1 68 21] 
+4

Почему вы говорите, что не можете «Короткий ответ: вы просто не можете (по крайней мере, не в общем случае)». Мне кажется, что я могу из того, что я прочитал в вашем ответе. Я смущен. –

+0

Я понимаю, что отображение не работает. Но, если я использую гигантский кортеж, возвращенный numpy, я все хорошо? Думаю, когда вы сказали «вы не можете», я на самом деле не уверен, что вы имеете в виду также в отношении исходного вопроса и как это имеет отношение к вещам, что имеет смысл? –

+0

Я не знаю, существует ли где-нибудь строгое определение того, какое семя должно быть в любом контексте. Если кортеж или любая другая структура возвращает вас к тому же состоянию случайности, которое вы желали, разве это не семя? Я не знал, что семя ** было ** целым числом. Но ваш ответ, похоже, работает, или есть оговорка, за исключением того целого представления, которое вы упомянули? –

1

Проверьте первый элемент массива, возвращенного np.random.get_state(), кажется, именно случайное семя мне.

+0

Да, хотя это явно не так, это, скорее всего, то, как уже предоставленный ответ удается работать так, как он есть. – Mast