随机抽样 ( numpy.random) #

快速开始

numpy.random模块实现了伪随机数生成器(简称 PRNG 或 RNG),能够从各种概率分布中抽取样本。一般来说,用户会创建一个Generator实例default_rng并调用其上的各种方法来从不同的发行版中获取样本。

>>> import numpy as np
>>> rng = np.random.default_rng()
# Generate one random float uniformly distributed over the range [0, 1)
>>> rng.random()  
0.06369197489564249  # may vary
# Generate an array of 10 numbers according to a unit Gaussian distribution.
>>> rng.standard_normal(10)  
array([-0.31018314, -1.8922078 , -0.3628523 , -0.63526532,  0.43181166,  # may vary
        0.51640373,  1.25693945,  0.07779185,  0.84090247, -2.13406828])
# Generate an array of 5 integers uniformly over the range [0, 10).
>>> rng.integers(low=0, high=10, size=5)  
array([8, 7, 6, 2, 0])  # may vary

我们的 RNG 是确定性序列,可以通过指定种子整数来重现以导出其初始状态。默认情况下,在不提供种子的情况下,default_rng将从操作系统的不确定数据创建 RNG 种子,因此每次都会生成不同的数字。伪随机序列对于所有实际目的都是独立的,至少是我们的伪随机性首先适合的那些目的。

>>> rng1 = np.random.default_rng()
>>> rng1.random()  
0.6596288841243357  # may vary
>>> rng2 = np.random.default_rng()
>>> rng2.random()  
0.11885628817151628  # may vary

警告

该模块中实现的伪随机数生成器是为统计建模和模拟而设计的。它们不适合安全或加密目的。有关此类用例,请参阅secrets标准库中的模块。

种子应该是大的正整数。default_rng可以取任意大小的正整数。我们建议使用非常大的、唯一的数字,以确保您的种子与其他人的不同。这是一个很好的做法,可以确保您的结果在统计上与他们的结果独立,除非您有意尝试重现他们的结果。获取此类种子数的一种便捷方法是使用secrets.randbits获取任意 128 位整数。

>>> import secrets
>>> import numpy as np
>>> secrets.randbits(128)  
122807528840384100672342137672332424406  # may vary
>>> rng1 = np.random.default_rng(122807528840384100672342137672332424406)
>>> rng1.random()
0.5363922081269535
>>> rng2 = np.random.default_rng(122807528840384100672342137672332424406)
>>> rng2.random()
0.5363922081269535

有关在特殊场景中控制种子的更高级选项,请参阅default_rng和的文档。SeedSequence

Generator及其相关的基础设施是在 NumPy 版本 1.17.0 中引入的。仍然有很多代码使用旧版本RandomStatenumpy.random.虽然目前没有计划删除它们,但我们建议Generator您尽可能过渡。这些算法更快、更灵活,并且未来将得到更多改进。在大多数情况下,Generator可以用作 的替代品RandomState。有关旧基础设施的信息, 请参阅旧版随机生成;有关过渡的信息,请参阅新增或不同之处;有关过渡的一些原因,请参阅NEP 19 。

设计

用户主要与Generator实例交互。每个Generator实例都拥有一个BitGenerator实现核心RNG算法的实例。他们的 BitGenerator职责有限。它管理状态并提供生成随机双精度值和随机无符号 32 位和 64 位值的函数。

Generator采用比特生成器提供的流并将它们转换为更有用的分布,例如模拟正态随机值。这种结构允许使用替代位生成器而几乎没有代码重复。

NumPy 实现了几个不同的BitGenerator类来实现不同的 RNG 算法。default_rng目前用作PCG64默认值BitGenerator。与MT19937传统算法相比,它具有更好的统计特性和性能RandomState。有关支持的 BitGenerators 的更多详细信息,请参阅 位生成器。

default_rngBitGenerators 将种子到 RNG 状态的转换委托给SeedSequence内部。SeedSequence实现一种复杂的算法,在用户输入和每个BitGenerator算法的内部实现细节之间进行中介,每个算法的状态可能需要不同数量的位。重要的是,它允许您使用任意大小的整数和此类整数的任意序列来混合在一起形成 RNG 状态。对于构建并行 RNG 流的灵活模式来说,这是一个有用的原语。

为了向后兼容,我们仍然保留遗留RandomState类。它继续MT19937默认使用该算法,旧种子继续重现相同的结果。 numpy.random 中的便利函数 仍然是单个全局RandomState实例上的方法的别名。有关完整的详细信息,请参阅 传统随机生成。有关和之间的详细比较,请参阅新增功能或不同之处GeneratorRandomState

并行生成#

所包含的生成器可以通过多种方式在并行、分布式应用中使用:

具有大量并行性的用户将需要咨询 使用 PCG64DXSM 升级 PCG64

概念#

特征

生成器和 BitGenerators 的原始来源#

该包是独立于 NumPy 开发的,并集成在 1.17.0 版本中。原始存储库位于https://github.com/bashtage/randomgen