主要是翻译了numpy官网的API Reference中的random模块:numpy参考手册(random模块)链接
快速开始
numpy.random模块实现了伪随机数生成器(pseudo-random number generators:简称PRNGs或RNGs),并具有从各种概率分布中抽取样本的能力。通常,用户可使用default_rng
创建一个Gernerate
实例,然后调用它的各种方法,从不同的概率分布中获取样本。
import numpy as np
rng = np.random.default_rng()
# 在[0, 1)上生成一个服从均匀分布的随机浮点数样本
rng.random()
# 0.06369197489564249 # 结果可能不同
# 创建一个大小为10的数组,其元素值服从标准高斯分布
rng.standard_normal(10)
# array([-0.31018314, -1.8922078 , -0.3628523 , -0.63526532, 0.43181166, # 结果可能不同
# 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]) # 结果可能不同
我们的随机数生成器(RNGs)是确定性序列,并且可以通过指定一个种子整数来重现它的初始状态。默认情况下,如果不提供种子,default_rng
将从操作系统中的非确定性数据中获取种子,因此每次生成的随机数序列是不同的。伪随机序列在实际应用中是独立的,至少对于我们最初设计的伪随机性所适用的目的而言是如此。
注意:本模块实现的伪随机数生成器主要被设计应用于统计和仿真领域,不适合应用于安全和加密领域。如果用于安全和加密,请查看Python标准库中的
secrets
模块。
种子最好是一个很大的正整数。但default_rng
依然可以使用任意大小的正整数。我们建议使用很大的、独一的数字,确保你的种子和别人的不同。这样可以确保你的结果和别人的结果在统计学上是独立的,除非你想重现别人的结果。可以使用secrets.randbits
模块方便地获取一个任意大小的128位整数。
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
模块以及相关基础支持代码已经在Numpy1.17.0版本中引入。但还有很多项目使用了旧版本的RandomState
模块和numpy.random
中的函数。虽然暂时没有计划移除旧版本的模块,但我们建议大家尽可能转为Generator
模块。该算法更快,弹性更强,未来还有更多的改进。大部分情况下,Generator
模块可以替换RandomState
。查看传统随机数生成器
,了解传统随机数生成机制; What’s New or Different,了解边关变动;查看NEP 19,了解转换到新模块的原因。
设计
用户主要和Generator
模块实例交互,每个Generator
示例包含一个BitGenerator
实例(该实例实现了RNG的核心算法)。BitGenerator
实例担负了有限的职责,它管理状态,并提供了创建随机双精度浮点数、无符号32位/64位随机整数的功能。
Generator
模块使用bit generator 提供的位流,并将他们转换为更多有用的概率分布,比如仿真正态分布。这个机制允许在少量重复代码的情况下,选择不同的bit generators。
Numpy实现了一些不同的BitGenerator
类,用于实现不同的伪随机数生成算法。default_rng
当前使用PCG64
作为默认的BitGenerator
。相比传统的基于MT19937
算法的RandomState
,它具有更好的统计属性和性能。
default_rng
和BitGenerator将种子转换为RNG状态的工作委托给SeedSequence
内部。SeedSequence
使用了一个复杂的算法,成为用户输入和每个BitGenerator
的实现细节(每个都需要大量不同的位来表示其状态)之间的中间人。重要的是,它让你可以使用任意大小的整数和以这些整数组成的任意序列,混合在一起变成RNG状态。当构造一个弹性的并行RNG流模板时,这是一个相当有用的原语。
为了后向兼容,我们仍然保留了传统的RandomState
类。它继续默认使用MT19937
算法,而且旧的种子仍然可以重现出相同的结果。
(未完待续)