同时播种 Numpy 和多个 Scipy 分布的正确方法

Proper Method to Seed Numpy and Multiple Scipy Distributions Concurrently

目前,我正在编写一个大型模拟,它使用来自 numpyscipy.stats 的多个分布的随机变量,并且分布也应该是独立的。为了寻求确保可重复性的方法,我幸运地偶然发现了 Abhinav 的回复 here,他们在其中提供了一个惊人的例子。然而,值得注意的是,它仅从 scipy 播种单个分布,而我的代码有多个 scipy 分布。有没有办法一次为所有 scipy 发行版播种(同时仍然为 numpy 发行版播种)?如果不是一次全部,是否可以对所有连续分布进行播种? (单独为每个分布播种似乎效率低下)。非常感谢!

编辑:可以在下面找到一个最小的可重现示例(它类似于 Abhinav 的示例):

from numpy.random import Generator, PCG64
from scipy.stats import binom, norm

n, p, size, seed = 10, 0.5, 10, 12345

numpy_randomGen = Generator(PCG64(seed))
scipy_randomGen = binom
scipy_randomGen2 = norm

numpy_randomGen = Generator(PCG64(seed))

# this is the part I want to simplify, as I have many distributions from scipy
# maybe there is a convention that simplifies it?
scipy_randomGen.random_state=numpy_randomGen
scipy_randomGen2.random_state=numpy_randomGen


print(scipy_randomGen.rvs(n, p, size=size))
print(scipy_randomGen2.rvs(size=size))
print(numpy_randomGen.binomial(n, p, size))

不确定你在找什么。您仍然需要分别为每个发行版播种。因此,没有比在

中为每个 rvs 调用提供 random_state arg 更简单的事情了

.rvs(n, p, size=size, random_state=...)

此处的 random_state 参数可以是生成器或整数种子(但在后一种情况下,它构建了一个旧式的 RandomState 对象并在后台为它播种。