随机抽样#

快速入门#

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_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 算法具有更好的统计特性和性能.有关受支持的 BitGenerator 的更多详细信息,请参阅 位生成器 .

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

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

并行生成#

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

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

概念#

功能特性#

生成器和 BitGenerators 的原始来源#

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