详解Python中Numpy.Random()函数的随机数生成实战(附代码)

numpy.random 是 NumPy 用于生成伪随机数的核心模块,相比 Python 原生 random,具备向量化生成、高效底层、多统计分布、可复现随机的核心优势。本文全面讲解随机种子、基础函数、正态分布、抽样排列、高级生成器及最佳实践,帮你快速掌握随机数生成,满足数据模拟、机器学习等场景需求。
一、掌握基础:随机种子(seed)
伪随机数的生成依赖 “种子”(初始值),固定种子后,每次生成的随机数完全一致 —— 这是调试、复现实验的关键。
用法示例:
import numpy as np # 1. 全局种子(影响所有 random 函数) np.random.seed(42) # 固定种子值(任意整数) print(np.random.rand(3)) # [0.3745 0.9507 0.7319] print(np.random.rand(3)) # [0.5986 0.1560 0.1559] # 重置种子,重新生成(结果和第一次完全一致) np.random.seed(42) print(np.random.rand(3)) # [0.3745 0.9507 0.7319] # 2. 局部随机生成器(推荐,不污染全局) rng = np.random.default_rng(seed=42) # 创建独立生成器 print(rng.rand(3)) # [0.7739 0.4389 0.8585]
关键说明:
np.random.seed():全局种子,设置后所有np.random.*函数都受影响;np.random.default_rng():NumPy 1.17+ 推荐用法,创建独立的随机生成器,避免全局种子冲突;- 种子值可任意选(如 42、10、2024),核心是 “固定值对应固定随机序列”。
二、常用随机函数分类(按场景)
1. 基础随机数(均匀分布)
生成 0~1 均匀分布、指定范围整数 / 浮点数,是最基础的随机数生成方式。
| 函数 | 作用 | 语法 | 示例 |
|---|---|---|---|
np.random.rand() |
0~1 均匀分布浮点数 | rand(d0,d1,…) | np.random.rand(2,3) ; // 2 行 3 列 0~1 浮点数 |
np.random.randn() |
标准正态分布(μ=0, σ=1) | randn(d0,d1,…) | np.random.randn(5) ; // 5 个标准正态数 |
np.random.randint() |
指定范围整数 | randint(low, high=None, size, dtype) | np.random.randint(0,10,(2,2)) ; // 0~9 的 2×2 整数 |
np.random.uniform() |
指定范围均匀分布浮点数 | uniform(low, high, size) | np.random.uniform(-5,15,31); // -5~15 的 31 个浮点数 |
实战示例(模拟 3 月温度,均匀分布):
import numpy as np
# 生成 3 月温度:-5~15℃均匀分布,31 天,保留 1 位小数
march_temp = np.round(np.random.uniform(-5, 15, 31), 1)
print("3 月温度(均匀分布):", march_temp[:10])
# 输出:[-1.2 8.7 12.3 4.5 9.8 0.7 11.1 7.2 2.9 14.8]
# 生成随机整数(模拟班级人数:30~50 人,5 个班级)
class_size = np.random.randint(30, 51, size=5)
print("班级人数:", class_size) # 输出:[42 35 48 39 41]
2. 正态分布随机数(高频!贴合你的场景)
生成指定均值(μ)、标准差(σ)的正态分布数,适合模拟自然数据(温度、分数、身高)。
| 函数 | 作用 | 语法 | 示例 |
|---|---|---|---|
np.random.normal() |
自定义正态分布 | normal(loc=μ, scale=σ, size) | np.random.normal(100,15,1000) ; // 均值 100,σ=15,1000 个 |
np.random.randn() |
标准正态分布(等价于 normal (0,1,size)) | randn(size) | np.random.randn(10); // μ=0, σ=1 |
实战示例(模拟考试分数):
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 生成 1000 个分数:均值 80,标准差 10,限制 0~100
scores = np.random.normal(80, 10, 1000)
scores = np.clip(scores, 0, 100) # 限制范围
# 绘制直方图验证分布
fig, ax = plt.subplots(figsize=(10, 6))
ax.hist(scores, bins=20, color='skyblue', edgecolor='black')
ax.set_title('考试分数正态分布', fontsize=16)
ax.set_xlabel('分数', fontsize=14)
ax.set_ylabel('人数', fontsize=14)
plt.show()
3. 随机抽样 / 排列(数据打乱、采样)
用于从已有数据中随机选择、打乱顺序,适合机器学习的数据集划分、随机采样。
| 函数 | 作用 | 语法 | 示例 |
|---|---|---|---|
np.random.shuffle() |
原地打乱数组(一维 / 二维按行打乱) | shuffle(arr) | arr = [1,2,3]; np.random.shuffle(arr) ; // [2,1,3] |
np.random.permutation() |
返回打乱后的新数组(不修改原数组) | permutation(arr/size) | np.random.permutation(5); // [3,1,4,2,0] |
np.random.choice() |
从数组中随机采样(可重复 / 不重复) | choice(arr, size, replace=True, p=概率) | np.random.choice([1,2,3], size=5, p=[0.2,0.5,0.3]) |
实战示例(数据集随机采样):
import numpy as np
# 原始数据:10 个学生 ID
student_ids = np.arange(1, 11) # [1,2,...,10]
# 1. 打乱数组(原地修改)
np.random.shuffle(student_ids)
print("打乱后的 ID:", student_ids) # 输出:[7 3 8 1 9 2 5 4 6 10]
# 2. 随机采样 5 个(不重复,无放回)
sample_ids = np.random.choice(student_ids, size=5, replace=False)
print("采样 ID(无放回):", sample_ids) # 输出:[3 9 2 6 10]
# 3. 按概率采样(比如抽中 1 的概率 0.8,其他 0.05)
prob_sample = np.random.choice([1,2,3,4], size=10, p=[0.8,0.05,0.05,0.1])
print("概率采样结果:", prob_sample) # 输出:[1 1 1 4 1 1 2 1 1 3]
4. 其他常用分布(专业场景)
适用于特定统计场景,如泊松分布(计数数据)、指数分布(时间间隔)、二项分布(二分类实验)。
| 函数 | 适用场景 | 示例 |
|---|---|---|
np.random.poisson() |
计数数据(如每天订单数、故障次数) | np.random.poisson(lam=5, size=10) ; // 均值 5 的泊松数 |
np.random.exponential() |
时间间隔(如排队等待时间、设备寿命) | np.random.exponential(scale=10, size=5); // 均值 10 的指数数 |
np.random.binomial() |
二分类实验(如抛硬币、抽奖) | np.random.binomial(n=10, p=0.5, size=3) ; // 10 次抛硬币正面次数 |
实战示例(模拟每天订单数):
import numpy as np
# 模拟 30 天订单数:均值 20 的泊松分布
orders = np.random.poisson(lam=20, size=30)
print("30 天订单数:", orders)
print("日均订单:", np.mean(orders)) # 接近 20
三、高级用法:自定义随机生成器(推荐)
NumPy 1.17+ 推出了新的随机 API(Generator),替代旧的 np.random.* 全局函数,优势是线程安全、功能更全、避免种子冲突。
用法示例:
import numpy as np
# 创建自定义生成器(固定种子)
rng = np.random.default_rng(seed=42)
# 生成随机数(用法和旧 API 类似,前缀改为 rng.)
print("0~1 均匀分布:", rng.rand(3))
print("正态分布:", rng.normal(80, 10, 5))
print("随机整数:", rng.integers(0, 10, size=3))
print("打乱数组:", rng.permutation([1,2,3]))
四、避坑点与最佳实践
1. 常见误区
- 混淆 rand/randn/normal:
rand():0~1 均匀分布;randn():标准正态(μ=0, σ=1);normal(loc, scale):自定义正态分布(常用);
- randint 的 high 参数:
randint(0,10)生成 0~9(不包含 10),需注意 “左闭右开”; - shuffle 原地修改:
shuffle(arr)直接修改原数组,如需保留原数组,用permutation()。
2. 最佳实践
- 固定种子:实验 / 调试时必须设置种子,确保结果可复现;
- 使用新生成器:优先用
np.random.default_rng()而非全局seed(); - 大规模生成:生成百万级随机数时,用 NumPy 而非 Python 原生
random(速度快 100 + 倍); - 范围限制:生成自然数据(温度、分数)时,用
np.clip()限制合理范围,避免极端值。
总结
numpy.random核心是生成伪随机数,通过种子实现可复现,向量化生成效率远超 Python 原生;- 高频函数(贴合你的场景):
- 模拟自然数据:
normal()(正态)、uniform()(均匀); - 数据打乱 / 采样:
shuffle()、choice()、permutation(); - 基础随机数:
rand()(0~1)、randint()(整数);
- 模拟自然数据:
- 推荐用法:用
np.random.default_rng()创建自定义生成器,避免全局种子冲突; - 避坑关键:区分不同分布函数,注意
randint左闭右开,生成数据后用clip()限制合理范围。
numpy.random 凭借高效、多维、可复现的特性,成为数据科学必备工具。牢记随机种子固定、优先使用 default_rng 独立生成器,区分各类随机函数用法,配合数据范围限制,可安全高效生成随机数据。熟练运用该模块,能大幅提升数据处理与实验仿真的开发效率。
以上关于详解Python中Numpy.Random()函数的随机数生成实战(附代码)的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » 详解Python中Numpy.Random()函数的随机数生成实战(附代码)
微信
支付宝