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

2024-05-19 03:20:20 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: numpysize状态checknprandomgenerateits
1条回答
网友
1楼 · 发布于 2024-05-19 03:20:20

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

相关问题 更多 >

    热门问题