我有一个模拟,需要每次迭代生成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的文章中的"播种多个进程"。