做用户消费金额的模拟数据,写了 np.random.normal(100, 20, 1000),画直方图一看,峰值挤在100附近,但尾巴长得很怪。同事瞄了一眼说,你把方差当标准差用了。

np.random.normal 的三个参数是 loc、scale、size。loc 是均值,scale 是标准差,size 是输出形状。只写 size 时,默认 loc=0、scale=1,等价于标准正态。方差20对应标准差约4.47,写成 scale=20 等于把分布拉宽了四倍多。

形状参数可以传元组

size=(1000, 3) 得到一千行三列的矩阵,做多变量模拟很方便。注意这样生成的三列是相互独立的,想要有相关性的数据,得用协方差矩阵做线性变换,或者用 multivariate_normal。

结果每次都不一样

默认用全局随机状态,复现结果要固定种子。老写法是 np.random.seed(42),新代码建议用 np.random.default_rng(42),再调 rng.normal。后者每个生成器独立,多线程下不会互相干扰,numpy 官方也推荐这个。

rng = np.random.default_rng(42) data = rng.normal(loc=100, scale=20, size=(1000, 3)) print(data.mean(axis=0))

正态不等于现实

消费金额、响应时长这类数据,实际分布往往是右偏的,硬套正态会生成一堆负数和离谱的极大值。真要贴近现实,用对数正态或者伽马分布,再按业务上限截断。np.clip 可以兜底,但截完就不叫正态了。

先用 scale 校准宽度,再考虑分布形状,顺序错了图怎么调都别扭。