4

我一直在使用 numpy 的随机功能,通过调用诸如np.random.choice()or之类的方法np.random.randint()。我刚刚发现了创建default_rng对象或其他Generator对象的能力:

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

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

np.random.randint(10)

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

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

4

1 回答 1

6

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

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

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

于 2020-03-09T23:04:56.643 回答