numpy.random的Generator类和np.random方法有什么区别?



我已经通过调用np.random.choice()np.random.randint()等方法使用numpy的随机功能一段时间了。我刚刚发现了创建default_rng对象或其他Generator对象的能力:

from numpy.random import default_rng
gen = default_rng()
random_number = gen.integers(10)

到目前为止,我会一直使用

np.random.randint(10)

相反,我想知道两种方式之间的区别是什么。

我能想到的唯一好处是跟踪多个种子,或者想要使用特定的PRNG,但对于更通用的用例来说,可能也有差异?

numpy.random.*函数(包括numpy.random.binomial(使用在应用程序中共享的全局伪随机数生成器(PRNG(对象。另一方面,default_rng()是一个独立的Generator对象,不依赖于全局状态。

如果你不关心可复制的";随机性";在您的应用程序中,这两种方法暂时是等效的。尽管NumPy的新RNG策略总体上不鼓励使用全局状态,但它并没有在1.17版本中弃用任何numpy.random.*函数,尽管未来版本的NumPy可能会这样做。

还要注意的是,由于numpy.random.*函数依赖于一个全局PRNG对象,而该对象不是线程安全的,因此如果应用程序使用多个线程,这些函数可能会导致竞争条件。(Generator对象也不是线程安全的,但有一些方法可以通过多线程生成伪随机数,而无需跨线程共享PRNG对象。(

最新更新