随机抽样 (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
>>> 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_rngSeedSequence 的文档,了解有关在专门场景中控制种子的更高级选项。

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 状态的委托给 SeedSequenceSeedSequence 实现了一种复杂的算法,它在用户的输入与每个 BitGenerator 算法的内部实现细节之间充当媒介,每个算法都需要不同的位数来表示其状态。重要的是,它允许您使用任意大小的整数和任意这些整数的序列混合到 RNG 状态中。这对于构建一个 灵活的并行 RNG 流模式 是一个有用的原语。

为了向后兼容,我们仍然保留了旧的 RandomState 类。它默认情况下继续使用 MT19937 算法,旧的种子仍然可以产生相同的结果。方便的 Functions in numpy.random 仍然是单个全局 RandomState 实例上的方法的别名。有关完整细节,请参见 Legacy random generation。有关 GeneratorRandomState 之间的详细比较,请参见 What’s new or different.

并行生成#

包含的生成器可以在并行、分布式应用程序中以多种方式使用

对于具有大量并行的用户,建议参考 Upgrading PCG64 with PCG64DXSM.

概念#

特性#

生成器和 BitGenerators 的原始来源#

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