通过对随机大小的可变调用控制numpy随机种子



我有一个模拟,需要每次迭代生成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无关

numpy.random.*函数使用在整个应用程序中共享的PRNG(伪随机数生成器(的单个全局实例。在您的代码示例中,np.random.normal将此PRNG提前不同的次数,以便随后的randint调用输出不同的伪随机数。

相反,如果模拟的不同部分需要不同的随机数流,那么与其依赖numpy.random.*的全局PRNG实例,不如使用两个或多个PRNG实例(每个实例都基于一个公共种子进行初始化(。

NumPy 1.17引入了一种新的随机数生成系统,并为此目的包括了几个设施。其中包括用于使用公共种子生成多个PRNG状态的SeedSequence类和保持PRNG的Generator类。新系统是一项修改RNG政策的提议的结果,该政策规定numpy.random.*功能通常不应再使用。这尤其是因为numpy.random.*在全局状态下运行。

NumPy文档现在有关于在新系统中播种多个PRNG的详细信息。另请参阅我的一篇关于PRNG的文章中的"播种多个进程"。

最新更新