随机抽样 (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_rng
和 SeedSequence
的文档.
Generator
及其相关基础设施是在 NumPy 1.17.0 版本中引入的.仍然有很多代码使用旧的 RandomState
和 numpy.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
实例方法的别名.完整详情请参见 遗留的随机生成.有关 Generator
和 RandomState
之间的详细比较,请参见 有什么新内容或不同之处.
并行生成#
包含的生成器可以通过多种方式用于并行、分布式应用程序:
种子序列
独立流
拥有大量并行性的用户会想要查阅 使用 PCG64DXSM 升级 PCG64.
概念#
特性#
生成器和BitGenerators的原始来源#
这个包是独立于 NumPy 开发的,并在版本 1.17.0 中被集成.原始仓库位于 bashtage/randomgen.