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 对象。)