Python 如何检索NumPy';的当前种子;s随机数发生器?
以下内容将导入NumPy并设置种子Python 如何检索NumPy';的当前种子;s随机数发生器?,python,numpy,random,random-seed,mersenne-twister,Python,Numpy,Random,Random Seed,Mersenne Twister,以下内容将导入NumPy并设置种子 import numpy as np np.random.seed(42) 然而,我对播下种子不感兴趣,而更感兴趣的是阅读它random.get_state()似乎不包含种子。答案并不明显 假设我没有手动设置,如何检索numpy.random使用的当前种子 我想使用当前的种子为流程的下一次迭代进行延续。简单的回答是,您根本不能(至少一般不能) numpy使用的RNG有219937-1个可能的内部状态,而单个64位整数只有264个可能的值。因此,不可能将每个R
import numpy as np
np.random.seed(42)
然而,我对播下种子不感兴趣,而更感兴趣的是阅读它random.get_state()
似乎不包含种子。答案并不明显
假设我没有手动设置,如何检索numpy.random
使用的当前种子
我想使用当前的种子为流程的下一次迭代进行延续。简单的回答是,您根本不能(至少一般不能) numpy使用的RNG有219937-1个可能的内部状态,而单个64位整数只有264个可能的值。因此,不可能将每个RNG状态映射到唯一的整数种子 您可以直接使用和获取并设置RNG的内部状态。
get\u state
的输出是一个元组,其第二个元素是32位整数的(624,)
数组。该数组有足够多的位来表示RNG的每个可能的内部状态(2624*32>219937-1)
get\u 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]
检查由
np.random.get_state()
返回的数组的第一个元素,在我看来它正是随机种子。这篇文章旨在澄清ali_m的正确答案,并作为对Dong Justin建议的重要更正
以下是我的发现:
np.random.seed(X)
设置随机种子后,您可以使用np.random.get_state()[1][0]
再次找到它语句1-您可以使用
np.random.get_state()[1][0]
找到随机种子
如果使用np.random.seed(123)
设置随机种子,则可以使用state=np.random.get_state()
将随机状态检索为元组。下面是对状态
(我在Spyder中使用变量资源管理器)的详细介绍。我使用的是一个屏幕截图,因为使用print(state)
将淹没您的控制台,因为元组的第二个元素中的数组的大小
您可以很容易地看到123
是第二个元素中包含的数组中的第一个数字。使用seed=np.random.get_state()[1][0]
将为您提供123
。完美的不完全是,因为:
声明2-但是,它对您没有什么用处:
起初可能不是这样,因为您可以使用np.random.seed(123)
,使用seed=np.random.get_state()[1][0]
检索相同的数字,使用np.random.seed(444)
重置种子,然后(似乎)使用np.random.seed(seed)
将其设置回123
场景。但是你之前已经知道你的随机种子是什么,所以你不需要这样做。下一个代码部分还将显示不能使用np.random.get_state()[1][0]
获取任何随机状态的第一个数字,并期望重新创建确切的场景。请注意,您很可能必须完全关闭并重新启动内核(或调用np.random.seed(None)
)才能看到这一点
下面的代码段使用np.random.randint()
生成5个介于-10和10之间的随机整数,并存储有关进程的一些信息:
片段1
请注意,名为seedState
的列与state
下的第一个数字相同。我本来可以把它打印成一个独立的号码,但我想把它放在同一个地方。还要注意,seedSet=123
和np.random.seed(seedSet)
到目前为止已经被注释掉了。由于没有设置随机种子,您的数字将与我的不同。但这并不重要,重要的是结果的内在一致性:
产出1:
在这种特殊情况下,seed=np.random.get_state()[1][0]
等于1558056443
。按照Dong Justins答案中的逻辑(以及我在编辑之前的答案),您可以使用np.random.seed(1558056443)
设置随机种子,并获得相同的随机状态。下一段代码将显示您不能执行以下操作:
片段2
产出2:
看到区别了吗np.random.get_state()[1][0]
对于输出1和输出2是相同的,但输出的其余部分则不同(最重要的是,随机数不同)。因此,正如ali_m已经明确指出的那样:
因此,不可能将每个RNG状态映射到唯一的整数种子
这个答案补充了其他人遗漏的重要细节。首先,重新表述结论: 原始随机种子(通过
np.random.seed
设置)在生成数字后无法检索,但中间产物(当前状态)可以
参考@vestland的答案;但是,它可能会误导:生成的数字不同不是因为无法映射状态,而是因为使用了不完整的编码:get\u state()[1]
。完整的表示包括pos=get\u state()[2]
。举例说明:
将numpy导入为np
state0=np.random.get_state()
rand0=np.random.randint(0,10,1)
state1=np.random.get_state()
rand1=np.random.randint(0,10,1)
断言全部(s0==s1表示s0,s1在zip中(state0[1],state1[1]))
我们生成了一个数字,但是get_state()[1]
保持不变。然而:
np.random.set\u状态(state0)
断言np.random.randint(0,10,1)=rand0
还有我
# 1. Imports
import pandas as pd
import numpy as np
# 2. set random seed
#seedSet = None
seedSet = 123
np.random.seed(seedSet)
# 3. describe random state
state = np.random.get_state()
state5 = np.random.get_state()[1][:5]
seedState = np.random.get_state()[1][0]
# 4. generate random numbers
random = np.random.randint(-10, 10, size = 5)
# 5. organize and present findings
df = pd.DataFrame.from_dict({'seedSet':seedSet, 'seedState':seedState, 'state':state, 'random':random})
print(df)
random seedSet seedState state
0 2 None 1558056443 1558056443
1 -1 None 1558056443 1808451632
2 4 None 1558056443 730968006
3 -4 None 1558056443 3568749506
4 -6 None 1558056443 3809593045
# 1. Imports
import pandas as pd
import numpy as np
# 2. set random seed
#seedSet = None
seedSet = 1558056443
np.random.seed(seedSet)
# 3. describe random state
#state = np.random.get_state()
state = np.random.get_state()[1][:5]
seedState = np.random.get_state()[1][0]
# 4. generate random numbers
random = np.random.randint(-10, 10, size = 5)
# 5. organize and present findings
df = pd.DataFrame.from_dict({'seedSet':seedSet, 'seedState':seedState, 'state':state, 'random':random})
print(df)
random seedSet seedState state
0 8 1558056443 1558056443 1558056443
1 3 1558056443 1558056443 1391218083
2 7 1558056443 1558056443 2754892524
3 -8 1558056443 1558056443 1971852777
4 4 1558056443 1558056443 2881604748