随机抽样#

快速入门#

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

>>> import numpy as np
>>> rng = np.random.default_rng()

生成一个在区间 \([0, 1)\) 上均匀分布的随机浮点数

>>> rng.random()  
0.06369197489564249  # may vary

根据单位高斯分布生成一个包含 10 个数字的数组

>>> 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])

生成一个在区间 \([0, 10)\) 上均匀分布的整数数组(共 5 个)

>>> rng.integers(low=0, high=10, size=5)  
array([8, 7, 6, 2, 0])  # may vary

我们的 RNG 是确定性序列,可以通过指定一个种子整数来派生其初始状态,从而实现可重复性。默认情况下,如果不提供种子,default_rng 将从操作系统提供的非确定性数据中播种 RNG,因此每次都会生成不同的数字。对于实际目的而言,伪随机序列将是独立的,至少对于我们伪随机性最初适用的那些目的而言。

>>> import numpy as np
>>> 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 numpy as np
>>> import secrets
>>> 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_rngSeedSequence 的文档。

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。它比旧版 RandomState 使用的 MT19937 算法具有更好的统计特性和性能。有关支持的 BitGenerators 的更多详细信息,请参阅 位生成器

default_rng 和 BitGenerators 在内部将种子转换为 RNG 状态的委托给了 SeedSequenceSeedSequence 实现了一种复杂的算法,该算法在用户输入和每个 BitGenerator 算法的内部实现细节之间进行中介,而这些细节可能需要不同数量的比特来表示其状态。重要的是,它允许您使用任意大小的整数和任意整数序列来混合成 RNG 状态。这是构建 并行 RNG 流的灵活模式 的有用原语。

为了向后兼容,我们仍然维护旧的 RandomState 类。它默认继续使用 MT19937 算法,旧种子将继续产生相同的结果。便捷的 numpy.random 中的函数 仍然是单个全局 RandomState 实例方法的别名。有关完整详细信息,请参阅 旧版随机生成。有关 GeneratorRandomState 之间的详细比较,请参阅 新增或不同之处

并行生成#

包含的生成器可以通过多种方式用于并行、分布式应用程序

需要大量并行性的用户应参考 使用 PCG64DXSM 升级 PCG64

概念#

特性#

Generator 和 BitGenerators 的原始来源#

此包独立于 NumPy 开发,并集成在 1.17.0 版本中。原始存储库位于 bashtage/randomgen