随机抽样#

快速入门#

The numpy.random module implements pseudo-random number generators (PRNGs or RNGs, for short) with the ability to draw samples from a variety of probability distributions. In general, users will create a Generator instance with default_rng and call the various methods on it to obtain samples from different distributions.

>>> 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 接受 bit generator 提供的流,并将其转换为更有用的分布,例如,模拟正态随机值.这种结构允许使用替代的 bit generator,而无需进行大量代码重复.

NumPy 实现了几个不同的 BitGenerator 类,这些类实现了不同的 RNG 算法. default_rng 目前使用 PCG64 作为默认的 BitGenerator .它比旧版 RandomState 中使用的 MT19937 算法具有更好的统计特性和性能.有关支持的 BitGenerators 的更多详细信息,请参阅 位生成器 .

default_rng 和 BitGenerators 在内部将种子转换为 RNG 状态委托给 SeedSequence . SeedSequence 实现了一种复杂的算法,该算法在用户的输入和每个 BitGenerator 算法的内部实现细节之间进行调解,每个算法可能需要不同数量的位来表示其状态.重要的是,它允许您使用任意大小的整数和任意此类整数序列来混合到 RNG 状态中.这是构建 flexible pattern for parallel RNG streams 的一个有用的原语.

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

并行生成#

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

具有大量并行性的用户将需要参考 使用 PCG64DXSM 升级 PCG64 .

概念#

特性#

Generator 和 BitGenerators 的原始来源#

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