随机抽样#
快速入门#
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_rng 和 SeedSequence 的文档。
Generator 及其相关基础设施已在 NumPy 1.17.0 版本中引入。仍有大量代码使用旧的 RandomState 和 numpy.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 状态的委托给了 SeedSequence。SeedSequence 实现了一种复杂的算法,该算法在用户输入和每个 BitGenerator 算法的内部实现细节之间进行中介,而这些细节可能需要不同数量的比特来表示其状态。重要的是,它允许您使用任意大小的整数和任意整数序列来混合成 RNG 状态。这是构建 并行 RNG 流的灵活模式 的有用原语。
为了向后兼容,我们仍然维护旧的 RandomState 类。它默认继续使用 MT19937 算法,旧种子将继续产生相同的结果。便捷的 numpy.random 中的函数 仍然是单个全局 RandomState 实例方法的别名。有关完整详细信息,请参阅 旧版随机生成。有关 Generator 和 RandomState 之间的详细比较,请参阅 新增或不同之处。
并行生成#
包含的生成器可以通过多种方式用于并行、分布式应用程序
需要大量并行性的用户应参考 使用 PCG64DXSM 升级 PCG64。
概念#
特性#
Generator 和 BitGenerators 的原始来源#
此包独立于 NumPy 开发,并集成在 1.17.0 版本中。原始存储库位于 bashtage/randomgen。