随机采样 (numpy.random)#

快速入门#

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

>>> 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 播种,因此每次生成不同的数字。对于所有实际目的而言,伪随机序列将是独立的,至少对于我们伪随机性最初就很好的那些目的而言是如此。

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

概念#

特性#

生成器和 BitGenerators 的原始来源#

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