Python NumPy随机模块详解:均匀分布、抽样与正态分布
本文深入解析Python NumPy库中的随机数生成模块。涵盖均匀分布函数np.random.random与rand的区别,整数生成np.random.randint,以及随机抽样np.random.choice的权重与替换参数。同时介绍标准与非标准正态分布np.random.randn与normal的实现,并探讨伪随机数生成器的种子机制及RandomState对象的使用,帮助开发者掌握数据模拟与算法测试的核心技巧。
1. 随机数
函数np.random.random()是生成随机数最基础且常用的方法,它产生的随机浮点数在[0, 1)区间内呈均匀分布。若调用时不传入任何参数,np.random.random()将直接返回一个单一的浮点型随机数。此外,np.random.random()支持接收整型或元组类型的参数,以此定义返回数组的形状(shape)。部分用户偏好使用np.random.rand()函数,其核心功能与np.random.random()一致,但np.random.rand()在参数处理上更为严格,不接受元组参数,必须通过两个独立的整型参数来指定形状。
import numpy as np
print(np.random.random())
print(np.random.random(2))
print(np.random.random((2,3)))函数np.random.randint()用于生成均匀分布的随机整数,其取值范围为[low, high)。当省略low参数时,系统默认low值为0。np.random.randint()函数还包含一个可选参数size,用于设定返回整型随机数数组的具体结构。
print(np.random.randint(10))
print(np.random.randint(10, size=5))
print(np.random.randint(10, size=(2,5)))
print(np.random.randint(10, 100, size=(2,5)))2. 随机抽样
随机抽样旨在从给定的有序列表中按指定数量随机选取元素,广泛应用于产品质检、抽签排序等场景。NumPy提供的核心抽样函数为np.random.choice(),其基本原型如下所示。
np.random.choice(a, size=None, replace=True, p=None)参数a代表待抽样的总体样本,仅支持整数或一维数组(列表)。若a为整数,则等效于以np.arange(a)作为抽样总体。参数size用于定义输出结果数组的形状。参数replace控制是否允许重复抽取同一样本,默认值为True(允许)。参数p是与总体样本等长的权重数组,用于指定各个样本被抽中的概率分布。
import numpy as np
print(np.random.choice(1,5)) # 抽签样本只有1个元素0,抽取5次
print(np.random.choice(['a','b','c'], size=(3,5), p=[0.5,0.25,0.25])) # 指定权重
print(np.random.choice(np.arange(100), size=(2,5), replace=False)) # 不允许重复3. 正态分布
生成标准正态分布随机数最简单的方式是使用np.random.randn()函数。np.random.randn()专门用于生成均值为0、标准差为1的标准正态分布随机数,该函数可接受一个或两个整型参数,用于指定输出数组的形状。
import numpy as np
print(np.random.randn()) # 标准正态分布,均值为0,标准差为1
print(np.random.randn(5))
print(np.random.randn(2,5))若需生成非标准正态分布的随机数,应选用np.random.normal()函数。np.random.nomal()默认生成均值为0、标准差为1的正态分布数据。通过参数loc可设定均值,参数scale设定标准差,参数size则指定输出数组的形状。对比代码示例可知,当指定标准差为0.2时,数据分布相较于默认标准差更紧密地聚集在均值附近。
print(np.random.normal()) # 默认均值为0,标准差为1
print(np.random.normal(loc=2, size=5)) # 参数loc指定均值为2
print(np.random.normal(loc=2, scale=0.2, size=(2,5))) # 参数loc指定均值为2,参数scale指定标准差为0.24. 伪随机数的深度思考
计算机程序或编程语言中产生的随机数实质上均为伪随机数。由于计算机硬件运行确定、代码逻辑固定且算法精确,仅依靠系统内部确定的因素无法产生真正的随机数,必须引入系统外的随机因子。计算机随机算法通常采用线性同余或平方取中等方法,依赖一个种子(常以系统时钟代替)来生成序列。这意味着,若已知种子及已生成的随机数,即可预测后续序列,这构成了伪随机数的可预测性特征。
NumPy随机函数内部封装了一个伪随机数生成器,每次实例化均需一个整数种子进行初始化。若两次初始化使用相同的种子,生成的随机数序列将完全一致。函数np.random.seed()可用于指定伪随机数生成器的初始化种子。
import numpy as np
np.random.seed(12345) # 使用'12345'随机种子初始化伪随机数生成器
print(np.random.random(5))
print(np.random.random((2,3)))
np.random.seed(12345) # 再次使用'12345'随机种子初始化伪随机数生成器
print(np.random.random(5)) # 和上面完全一致
print(np.random.random((2,3))) # 和上面完全一致从上述代码汇总可以看出,只要指定相同的种子,后续生成的随机序列将完全一致。这表明,唯有引入外部真正的随机因子(如天空云朵形状、邻居无线网络信号强度等)作为种子,才能获得真正的随机数。
此外,NumPy还提供了直接操作随机数生成器的接口,允许用户通过实例化生成器对象来生成随机数。
r = np.random.RandomState(12345) # 使用随机数生成器也同样
print(r.random(5)) # 和上面完全一致
print(r.random((2,3))) # 和上面完全一致至此,关于Python NumPy随机模块的介绍及方法已阐述完毕。如需了解更多Python NumPy相关内容,请查阅本站往期文章或继续浏览后续文章,感谢大家的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













