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

joh*_*ack 8 python random numpy numpy-random

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

from numpy.random import default_rng
gen = default_rng()
random_number = gen.integers(10)
Run Code Online (Sandbox Code Playgroud)

到目前为止我一直会使用

np.random.randint(10)
Run Code Online (Sandbox Code Playgroud)

相反,我想知道这两种方式有什么区别。

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

Pet*_* O. 12

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

如果您不关心应用程序中可重复的“随机性”,那么这两种方法暂时是等效的。尽管NumPy 的新 RNG 政策一般不鼓励使用全局状态,但它并没有弃用numpy.random.*1.17 版中的任何函数,尽管 NumPy 的未来版本可能会弃用。

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