随机抽样 (numpy.random)#

快速开始#

numpy.random 模块实现了伪随机数生成器(PRNGs 或 RNGs),能够从多种概率分布中抽取样本.通常,用户会使用 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 版本中引入的.仍然有很多代码使用旧的 RandomStatenumpy.random 中的函数.虽然目前没有计划移除它们,但我们建议尽可能过渡到 Generator.这些算法更快、更灵活,并且在未来会得到更多改进.在大多数情况下,`Generator` 可以作为 RandomState 的替代品.有关旧基础设施的信息,请参见 遗留的随机生成;有关过渡的信息,请参见 有什么新内容或不同之处;有关过渡的一些理由,请参见 NEP 19.

设计#

用户主要与 Generator 实例交互.每个 Generator 实例拥有一个实现核心 RNG 算法的 BitGenerator 实例.`BitGenerator` 有有限的责任.它管理状态并提供函数来生成随机双精度数和随机无符号 32 位和 64 位值.

Generator 接收位生成器提供的流,并将它们转换为更有用的分布,例如,模拟正态随机值.这种结构允许使用替代位生成器,而代码重复很少.

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

default_rng 和 BitGenerators 将种子转换为 RNG 状态的任务委托给 SeedSequence 内部处理.`SeedSequence` 实现了一个复杂的算法,介于用户的输入和每个 BitGenerator 算法的内部实现细节之间,每个算法可能需要不同数量的位来表示其状态.重要的是,它允许你使用任意大小的整数和任意序列的这些整数混合到 RNG 状态中.这是构建 并行 RNG 流灵活模式 的有用原语.

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

并行生成#

包含的生成器可以通过多种方式用于并行、分布式应用程序:

拥有大量并行性的用户会想要查阅 使用 PCG64DXSM 升级 PCG64.

概念#

特性#

生成器和BitGenerators的原始来源#

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