在数据分析、统计模拟以及机器学习中,随机数生成是必不可少的环节。你是否想过,那些用于测试的样本数据、模型的初始参数,或是蒙特卡洛模拟中的随机事件,是如何被精确构造出来的?NumPy 的 numpy.random 模块正是为解决这些问题而设计的一套强大工具集。
它允许我们生成满足特定概率分布的随机数,为科学计算和数据科学实验提供可重复的随机性基础。
需要说明的是,从 NumPy 1.17 开始,官方推荐使用新的随机数生成体系(Generator 对象)。本文介绍的 numpy.random.* 函数属于传统随机数接口(legacy API),但由于其在大量现存代码与教材中仍被广泛使用,因此仍具有重要的学习和参考价值。
按照功能划分,我们可以将这些函数大致归为五类:
- 随机数生成器控制
- 均匀分布随机数
- 整数随机数
- 随机抽样与排列
- 常见概率分布
一、随机数生成器控制
为了保证实验的可复现性,我们经常需要固定随机序列的起点,这时就需要用到随机种子。
seed()
设置随机数种子(Random Seed)。
numpy.random.seed(seed)
参数说明:
示例:
import numpy as np
np.random.seed(42)
np.random.rand(3)
输出示例:
[0.37454012 0.95071431 0.73199394]
说明:设置相同的 seed,在相同的 NumPy 版本与实现下,通常可以复现出完全相同的随机数序列。
二、均匀分布随机数
均匀分布(Uniform Distribution)是最基础也是最常用的随机数类型。NumPy 中部分函数名称并未直接体现 “uniform”,例如 rand() 与 random(),但它们本质上都生成 [0, 1) 区间的均匀分布随机数。
rand()
生成 [0, 1) 区间的均匀分布随机数。
numpy.random.rand(d0, d1, ..., dn)
参数说明:
示例:
np.random.rand(2, 3)
输出示例:
[[0.12 0.56 0.91]
[0.44 0.32 0.77]]
说明:返回值范围为 0 ≤ x < 1。
random()
生成 [0, 1) 区间的均匀分布随机数。功能与 rand() 类似,但参数指定方式不同。
numpy.random.random(size=None)
参数说明:
示例:
np.random.random((2, 3))
生成指定区间 [low, high) 的均匀分布随机数。
numpy.random.uniform(low=0.0, high=1.0, size=None)
参数说明:
low:区间下限(包含)。
high:区间上限(通常不包含)。
size:输出数组形状。
示例:
np.random.uniform(10, 20, size=5)
输出示例:
[13.4 17.1 10.8 19.2 15.6]
三、整数随机数
除了浮点数,NumPy 也能方便地生成随机整数。
randint()
生成指定范围 [low, high) 的随机整数。
numpy.random.randint(low, high=None, size=None, dtype=int)
参数说明:
low:最小值(包含)。
high:最大值(不包含)。如果 high 为 None,则生成范围是 [0, low)。
size:输出数组形状。
dtype:输出整数的数据类型。
示例:
np.random.randint(0, 10, size=5)
输出示例:
[3 7 1 9 0]
说明:生成范围为 low ≤ x < high。
四、随机抽样与排列
这部分函数用于从给定数据中进行随机选择或重新排列顺序。
choice()
从给定的一维数组或整数序列中随机抽取元素。
numpy.random.choice(a, size=None, replace=True, p=None)
参数说明:
a:一维数组或整数。若为整数 n,则表示从 0 到 n-1 的整数序列中选择。
size:抽样数量。
replace:是否允许重复抽样(有放回抽样),默认为 True。
p:每个元素被抽中的概率分布,其长度应与 a 一致,且所有概率之和应为 1。
示例:
np.random.choice([10, 20, 30, 40], size=3)
输出示例:
[20 40 10]
permutation()
返回序列的随机排列(副本)。原数组不会被修改。
numpy.random.permutation(x)
参数说明:
x:整数或数组。
- 如果
x 为整数 n,返回 0~n-1 的随机排列。
- 如果
x 为数组,则返回数组元素的随机排列。
示例:
np.random.permutation(5)
输出示例:
[3 0 4 1 2]
shuffle()
原地打乱数组的顺序。注意:此函数会直接修改原数组。
numpy.random.shuffle(x)
参数说明:
示例:
a = np.array([1, 2, 3, 4, 5])
np.random.shuffle(a)
print(a)
说明:shuffle() 会直接修改原数组。对于多维数组,shuffle() 默认只打乱第一轴(即行顺序)。
五、常见概率分布
NumPy 的强大之处在于能够生成服从多种统计概率分布的随机数,这是进行复杂模拟和分析的基础。
normal()
生成正态分布(高斯分布)随机数。
numpy.random.normal(loc=0.0, scale=1.0, size=None)
参数说明:
loc:均值(分布的中心)。
scale:标准差(分布的宽度)。
size:输出数组形状。
示例:
np.random.normal(0, 1, size=5)
说明:当 loc=0, scale=1 时,生成的是标准正态分布。正态分布广泛用于描述自然误差、统计推断以及机器学习中的数据预处理。
binomial()
生成二项分布随机数。它描述了在 n 次独立的是/非试验中成功的次数。
numpy.random.binomial(n, p, size=None)
参数说明:
n:试验次数。
p:每次试验成功的概率。
size:输出数组形状。
示例:
np.random.binomial(10, 0.5, size=5)
说明:例如,模拟抛10次硬币得到正面朝上的次数。
poisson()
生成泊松分布随机数。常用于描述单位时间或空间内随机事件发生的次数。
numpy.random.poisson(lam=1.0, size=None)
参数说明:
lam:单位时间(或单位面积)内事件发生的平均次数(λ)。
size:输出数组形状。
示例:
np.random.poisson(3, size=5)
exponential()
生成指数分布随机数。常用于描述独立随机事件发生的时间间隔。
numpy.random.exponential(scale=1.0, size=None)
参数说明:
scale:尺度参数(通常等于平均间隔时间的倒数 1/λ)。
size:输出数组形状。
示例:
np.random.exponential(1.0, size=5)
gamma()
生成 Gamma 分布随机数。它是多个独立指数分布变量之和的分布,常用于描述等待时间或作为贝叶斯统计中的先验分布。
numpy.random.gamma(shape, scale=1.0, size=None)
参数说明:
shape:形状参数(k)。
scale:尺度参数(θ)。
size:输出数组形状。
示例:
np.random.gamma(2.0, 2.0, size=5)
beta()
生成 Beta 分布随机数。其值域在 [0, 1] 之间,常用于对概率本身进行建模,是贝叶斯统计中的重要分布。
numpy.random.beta(a, b, size=None)
参数说明:
a:形状参数 α。
b:形状参数 β。
size:输出数组形状。
示例:
np.random.beta(2, 5, size=5)
chisquare()
生成卡方分布随机数。这是统计学中用于假设检验(如独立性检验、拟合优度检验)的基础分布。
numpy.random.chisquare(df, size=None)
参数说明:
示例:
np.random.chisquare(3, size=5)
lognormal()
生成对数正态分布随机数。如果一个变量的对数服从正态分布,那么这个变量本身就服从对数正态分布,常用于描述收入分布、粒子大小等正偏态数据。
numpy.random.lognormal(mean=0.0, sigma=1.0, size=None)
参数说明:
mean:对应正态分布的均值(对数均值)。
sigma:对应正态分布的标准差(对数标准差)。
size:输出数组形状。
示例:
np.random.lognormal(0, 1, size=5)
小结
NumPy 在 numpy.random 模块中提供的这套传统随机数函数,构成了 [Python](https://yunpan.plus/f/26-1) 科学计算生态的基石之一。从简单的均匀分布 rand(),到复杂的概率分布如 normal()、gamma(),再到实用的抽样函数 choice() 和 shuffle(),它们为数据模拟、统计分析、算法测试和机器学习实验提供了可靠且高效的随机性来源。
虽然官方推荐转向新的 Generator API 以获得更好的性能和特性,但掌握这些经典函数对于阅读和维护遗留代码、理解随机数生成的基本原理依然至关重要。希望这篇梳理能帮助你在 [云栈社区](https://yunpan.plus) 的学习和项目实践中,更加游刃有余地驾驭随机性。