我有一个模拟,需要在每次迭代中生成N
个随机数。但是,N
根据模拟的状态而变化。由于N
不同,对numpy.random()
的调用后面的会产生不同的结果。但是,我希望以下对numpy.random()
的调用不受N
的影响
我通过(1)在numpy.random()
调用之前生成一个大的随机整数,然后(2)在numpy.random()
调用之后将随机种子设置为这个整数来解决这个问题(见下文)。然而,这似乎很笨拙
有没有更好的方法来控制不受size
参数影响的numpy.random的状态
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引入了一个new random number generation system,并为此目的包括了几个设施。其中包括一个用于使用公共种子生成多个PRNG状态的
SeedSequence
类,以及一个包含PRNG的Generator
类。新系统是proposal to change the RNG policy的结果,它指出numpy.random.*
函数一般不应再使用。这尤其是因为numpy.random.*
在全局状态上运行NumPy文档现在有关于新系统中seeding multiple PRNGs的详细信息。另见我的一篇关于PRNG的文章中的“Seeding Multiple Processes”
相关问题 更多 >
编程相关推荐