随机抽样 (numpy.random
)#
快速入门#
numpy.random
模块实现了伪随机数生成器(简称 PRNG 或 RNG),它能够从各种概率分布中抽取样本。通常,用户会使用 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
实例都拥有一个 BitGenerator
实例,该实例实现了核心 RNG 算法。 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
算法,旧的种子仍然可以产生相同的结果。方便的 Functions in numpy.random 仍然是单个全局 RandomState
实例上的方法的别名。有关完整细节,请参见 Legacy random generation。有关 Generator
和 RandomState
之间的详细比较,请参见 What’s new or different.
并行生成#
包含的生成器可以在并行、分布式应用程序中以多种方式使用
对于具有大量并行的用户,建议参考 Upgrading PCG64 with PCG64DXSM.
概念#
特性#
生成器和 BitGenerators 的原始来源#
此包是独立于 NumPy 开发的,并在 1.17.0 版本中集成。原始仓库位于 bashtage/randomgen.