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

8

我已经使用numpy的随机功能有一段时间了,通过调用诸如np.random.choice()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,但也许在更通用的用例中还有区别?


1
randintnp.random的其他函数现已弃用,转而使用生成器。使用多个独立的随机数流是它们的优点之一,但生成器还允许您在不同的位生成器算法之间进行选择,甚至可以实现自己的算法,因此更加灵活,也可能使可重复性更容易实现。 - jdehesa
可重复性和灵活性的论点确实有道理,尽管我猜编写自己的位生成器大多限于加密应用? - johannesack
1
是的,我认为这仅限于非常特定的应用程序、研究/学习或特定情况,其中您正在尝试完全匹配其他软件的行为。 - jdehesa
这个回答解决了你的问题吗?如何使用numpy.random从特定分布生成随机数? - Peter O.
@PeterO。不完全是,我确实理解使用方法,但我想知道是否存在一些潜在的差异需要注意。或者是否有任何非明显的切换到新接口的好处等。 - johannesack
1个回答

11

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

如果您的应用程序不关心可重复的“随机性”,那么这两种方法目前是等效的。尽管NumPy的新RNG策略通常不建议使用全局状态,但在1.17版本中没有废弃任何numpy.random.*函数,不过在将来的NumPy版本中可能会废弃。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接