NumPy-随机数生成详解
-
- 一、随机数生成的基础:伪随机数与种子
-
- [1. 伪随机数的本质](#1. 伪随机数的本质)
- [2. 种子的设置:确保结果可复现](#2. 种子的设置:确保结果可复现)
- 二、常用随机数生成函数
-
- [1. 均匀分布随机数](#1. 均匀分布随机数)
- [2. 正态分布随机数](#2. 正态分布随机数)
- [3. 整数随机数](#3. 整数随机数)
- [4. 其他常用分布](#4. 其他常用分布)
- 三、随机数生成的进阶操作
-
- [1. 随机排列与洗牌](#1. 随机排列与洗牌)
- [2. 控制随机数的维度与形状](#2. 控制随机数的维度与形状)
- 四、随机数生成的应用场景
-
- [1. 数据增强](#1. 数据增强)
- [2. 蒙特卡洛模拟](#2. 蒙特卡洛模拟)
- [3. 随机初始化参数](#3. 随机初始化参数)
- 五、注意事项
NumPy作为Python数值计算的核心库,提供了功能强大、性能高效的随机数生成模块------numpy.random
,该模块不仅能生成各种分布的随机数,还能满足可重复性、批量生成等需求。
一、随机数生成的基础:伪随机数与种子
1. 伪随机数的本质
计算机生成的随机数并非真正意义上的随机,而是通过确定性算法产生的伪随机数。这些随机数看似无规律,但实际上由初始值(种子)完全决定。只要种子相同,生成的随机数序列就会完全一致,这一特性为实验的可重复性提供了保障。
2. 种子的设置:确保结果可复现
通过np.random.seed()
函数可以设置随机数种子,固定随机数序列:
python
import numpy as np
# 设置种子
np.random.seed(42)
# 生成随机数
print(np.random.rand(3)) # [0.37454012 0.95071431 0.73199394]
# 重新设置相同种子,生成相同序列
np.random.seed(42)
print(np.random.rand(3)) # [0.37454012 0.95071431 0.73199394]
在科研实验或程序调试中,设置种子能确保多次运行的结果一致,便于问题定位和结果验证。
二、常用随机数生成函数
1. 均匀分布随机数
均匀分布是最常用的随机分布之一,其随机数在指定区间内均匀取值。
-
np.random.rand(d0, d1, ..., dn)
:生成[0, 1)区间内的均匀分布随机数,形状由参数指定。python# 生成2行3列的均匀分布随机数 arr = np.random.rand(2, 3) print(arr) # 输出: # [[0.59865848 0.15601864 0.15599452] # [0.05808361 0.86617615 0.60111501]]
-
np.random.uniform(low=0.0, high=1.0, size=None)
:生成[low, high)区间内的均匀分布随机数,更灵活地指定范围。python# 生成5个[10, 20)区间的均匀分布随机数 arr = np.random.uniform(10, 20, size=5) print(arr) # [12.05844943 17.8158732 11.18274425 16.17365467 12.11334366]
2. 正态分布随机数
正态分布(高斯分布)是自然界中最常见的分布之一,许多现象都近似遵循正态分布。
-
np.random.randn(d0, d1, ..., dn)
:生成均值为0、标准差为1的标准正态分布随机数。python# 生成3个标准正态分布随机数 arr = np.random.randn(3) print(arr) # [0.49671415 -0.1382643 0.64768854]
-
np.random.normal(loc=0.0, scale=1.0, size=None)
:生成均值为loc
、标准差为scale
的正态分布随机数。python# 生成2行2列、均值为5、标准差为2的正态分布随机数 arr = np.random.normal(loc=5, scale=2, size=(2, 2)) print(arr) # 输出: # [[4.87300259 3.87939188] # [5.85916983 6.23844269]]
3. 整数随机数
在需要生成离散整数的场景中,以下函数非常实用。
-
np.random.randint(low, high=None, size=None, dtype=int)
:生成[low, high)区间内的整数随机数。python# 生成5个[1, 10)区间的整数 arr = np.random.randint(1, 10, size=5) print(arr) # [3 7 8 5 9]
-
np.random.choice(a, size=None, replace=True, p=None)
:从数组a
中随机选择元素,可指定概率分布。python# 从[1, 2, 3]中随机选择3个元素(可重复) arr = np.random.choice([1, 2, 3], size=3) print(arr) # [2 1 3] # 按指定概率选择元素(p的和必须为1) arr = np.random.choice([1, 2, 3], size=3, p=[0.1, 0.6, 0.3]) print(arr) # [2 2 3](2被选中的概率更高)
4. 其他常用分布
除了上述分布,numpy.random
还支持多种其他分布的随机数生成,如指数分布、泊松分布等。
-
np.random.exponential(scale=1.0, size=None)
:生成指数分布随机数,scale
为1/λ。pythonarr = np.random.exponential(scale=2, size=3) print(arr) # [1.52275333 0.88770418 3.14869517]
-
np.random.poisson(lam=1.0, size=None)
:生成泊松分布随机数,lam
为λ(均值和方差)。pythonarr = np.random.poisson(lam=3, size=4) print(arr) # [4 2 3 5]
三、随机数生成的进阶操作
1. 随机排列与洗牌
在需要打乱数据顺序的场景中,随机排列函数非常有用。
-
np.random.permutation(x)
:返回一个随机排列的数组,或对整数序列进行随机排列。python# 对数组进行随机排列 arr = np.array([1, 2, 3, 4, 5]) permuted = np.random.permutation(arr) print(permuted) # [3 5 1 2 4] # 生成0-4的随机排列 permuted = np.random.permutation(5) print(permuted) # [2 4 1 0 3]
-
np.random.shuffle(x)
:原地打乱数组x
的顺序(无返回值)。pythonarr = np.array([1, 2, 3, 4, 5]) np.random.shuffle(arr) print(arr) # [5 2 4 1 3]
2. 控制随机数的维度与形状
NumPy的随机数生成函数支持通过size
参数灵活指定输出数组的形状,无论是一维、二维还是更高维数组,都能轻松生成。
python
# 生成3维数组(2×3×4)的均匀分布随机数
arr = np.random.rand(2, 3, 4)
print(arr.shape) # (2, 3, 4)
四、随机数生成的应用场景
1. 数据增强
在机器学习中,为了扩充训练数据、提高模型的泛化能力,常对原始数据进行随机变换,如随机裁剪、随机翻转等,这些操作都依赖于随机数生成。
python
# 模拟对图像进行随机水平翻转(50%概率)
def random_flip(image):
if np.random.rand() > 0.5:
return image[:, ::-1] # 水平翻转
return image
# 假设image是一个二维图像数组
image = np.array([[1, 2, 3], [4, 5, 6]])
flipped_image = random_flip(image)
print(flipped_image)
2. 蒙特卡洛模拟
蒙特卡洛模拟通过大量随机抽样来求解复杂问题,在金融、物理等领域有广泛应用。例如,用蒙特卡洛方法估算圆周率:
python
n = 1000000 # 抽样次数
x = np.random.uniform(-1, 1, n)
y = np.random.uniform(-1, 1, n)
# 计算落在单位圆内的点的数量
inside = (x**2 + y**2) <= 1
pi_estimate = 4 * np.sum(inside) / n
print(pi_estimate) # 约为3.14(随着n增大,精度提高)
3. 随机初始化参数
在机器学习模型训练前,通常需要随机初始化模型参数(如权重矩阵),正态分布和均匀分布是常用的初始化方式。
python
# 随机初始化一个3×2的权重矩阵(均值0,标准差0.01)
weights = np.random.normal(loc=0, scale=0.01, size=(3, 2))
print(weights)
# 输出:
# [[-0.00463418 -0.00465729]
# [ 0.01523029 0.00375698]
# [-0.00634322 -0.00362741]]
五、注意事项
-
种子的作用范围 :
np.random.seed()
设置的种子只对后续的numpy.random
模块函数有效,且在多线程环境中可能会出现种子混乱的问题,此时可使用numpy.random.RandomState
创建独立的随机数生成器。python# 创建独立的随机数生成器 rng = np.random.RandomState(42) print(rng.rand(3)) # [0.37454012 0.95071431 0.73199394]
-
性能考量 :NumPy的随机数生成函数底层由C实现,性能远优于Python原生的
random
模块,尤其在生成大规模随机数时,优势更为明显。 -
分布参数的选择:不同的应用场景需要选择合适的分布。例如,初始化神经网络权重时,常用正态分布或均匀分布;模拟等待时间时,常用指数分布。
That's all, thanks for reading~~
觉得有用就
点个赞
、收进收藏
夹吧!关注
我,获取更多干货~