Python 如何检索NumPy';的当前种子;s随机数发生器?

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

以下内容将导入NumPy并设置种子

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