随机抽样#
快速入门#
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_rng 和 SeedSequence 的文档.
Generator 及其相关基础设施是在 NumPy 1.17.0 版本中引入的. 仍然有很多代码使用旧的 RandomState 和 numpy.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 实例上的方法的别名.有关完整详细信息,请参阅 旧版随机数生成 .有关 Generator 和 RandomState 之间详细比较,请参阅 新增功能或不同之处 .
并行生成#
包含的生成器可以通过多种方式在并行,分布式应用程序中使用:
具有大量并行性的用户将需要参考 使用 PCG64DXSM 升级 PCG64 .
概念#
特性#
Generator 和 BitGenerators 的原始来源#
此软件包是独立于 NumPy 开发的,并在 1.17.0 版本中集成.原始仓库位于 bashtage/randomgen.