np.random.normal 是生成正态分布随机数的首选方法,接受 loc(均值)、scale(标准差)和 size 参数,注意 scale 是标准差而非方差;推荐使用 generator api(如 default_rng())以获得线程安全与未来兼容性。

用 np.random.normal 生成正态分布随机数最直接
绝大多数场景下,np.random.normal 是首选。它接受 loc(均值)、scale(标准差)和 size 三个核心参数,返回 ndarray。注意:NumPy 1.17+ 推荐使用 Generator API,但 np.random.normal 仍完全可用且语义清晰。
常见错误是混淆 scale 和方差——scale 必须是标准差,不是方差。比如想生成均值为 5、方差为 4 的数据,得写 scale=2,而不是 scale=4。
- 生成 1000 个 N(0, 1) 随机数:
np.random.normal(size=1000) - 生成 3×4 矩阵,均值 10、标准差 3:
np.random.normal(loc=10, scale=3, size=(3, 4)) - 若需可复现结果,务必设
random_state参数(旧版)或先创建Generator(新版)
为什么不用 np.random.randn?它其实只是特例
np.random.randn 等价于 np.random.normal(loc=0, scale=1, size=...),只生成标准正态分布。它不支持自定义均值和标准差,用错场景会导致结果偏移——比如你直接用 np.random.randn(1000) * 2 + 5 模拟 N(5, 2),虽然数学上等价,但多一次乘加操作,可读性和意图表达不如直接调 np.random.normal(loc=5, scale=2)。
- 仅当明确需要标准正态(μ=0, σ=1)时才用
np.random.randn - 混用
randn和缩放偏移容易出错,尤其在批量生成不同参数分布时难维护 - 性能差异可忽略,但语义明确性更重要
遇到“DeprecationWarning: Generator is deprecated”怎么办?
如果你看到这个警告,说明你在用已弃用的全局随机状态(如直接调 np.random.seed() 后再用 np.random.normal)。NumPy 建议显式创建 Generator 实例:
rng = np.random.default_rng(seed=42) samples = rng.normal(loc=0, scale=1, size=1000)
新 API 更安全(线程友好)、更灵活(支持更多分布),且未来版本会彻底移除旧接口。但注意:rng.normal 的参数名和顺序与 np.random.normal 完全一致,迁移成本极低。
- 旧写法
np.random.seed(42); np.random.normal(...)仍能运行,但警告会持续出现 - 多个独立随机流?必须用多个
Generator实例,不能共享同一个rng -
default_rng()支持多种种子类型(int、bytes、SeedSequence),比旧seed()更健壮
生成后怎么验证是否真符合正态分布?
光看函数名不等于结果正确。建议快速验证:用 scipy.stats.shapiro 做夏皮罗-威尔克检验,或画直方图叠加密度曲线。
- 小样本(
-
plt.hist(samples, density=True, bins=30)后叠加scipy.stats.norm(loc=..., scale=...).pdf(x)曲线,肉眼判断吻合度 - 若发现明显偏斜或峰度异常,回头检查是否误用了方差当标准差,或
size参数传错(比如传了字符串或 None)
真正麻烦的是分布参数随上下文动态变化,这时别硬拼接数组,用向量化 size 或列表推导配合 Generator 更稳。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











