numpy.random 的生成器 class 和 np.random 方法有什么区别?
What is the difference between numpy.random's Generator class and np.random methods?
我通过调用 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()
是一个独立的生成器对象,不依赖于全局状态。
如果你不关心应用程序中可重现的“随机性”,这两种方法暂时是等价的。虽然 NumPy's new RNG policy 通常不鼓励使用全局状态,但它并没有在 1.17 版中弃用任何 numpy.random.*
函数,尽管 NumPy 的未来版本可能会弃用。
另请注意,由于 numpy.random.*
函数依赖于非线程安全的全局 PRNG 对象,因此这些函数 if your application uses multiple threads. (Generator
objects are not thread-safe, either, but there are ways to generate pseudorandom numbers via multithreading 无需跨线程共享 PRNG 对象。)
我通过调用 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()
是一个独立的生成器对象,不依赖于全局状态。
如果你不关心应用程序中可重现的“随机性”,这两种方法暂时是等价的。虽然 NumPy's new RNG policy 通常不鼓励使用全局状态,但它并没有在 1.17 版中弃用任何 numpy.random.*
函数,尽管 NumPy 的未来版本可能会弃用。
另请注意,由于 numpy.random.*
函数依赖于非线程安全的全局 PRNG 对象,因此这些函数 Generator
objects are not thread-safe, either, but there are ways to generate pseudorandom numbers via multithreading 无需跨线程共享 PRNG 对象。)