Numpy如何基于正态、泊松、指数等分布生成随机数,采用何种采样方法?
NumPy 分布随机数采样实现方法
NumPy的随机数生成能力当前主要由numpy.random.Generator类提供(旧版本对应RandomState类),不同概率分布不会统一采用逆采样法,而是会根据数值稳定性、计算效率选择最适配的采样算法,常见分布的具体实现如下:
- 指数分布:采用逆变换采样实现,底层通过均匀随机数U代入公式
-log(1-U)/λ直接得到结果,无额外计算开销。 - 正态分布:默认采用Ziggurat算法实现,相比逆采样、Box-Muller算法拥有更高的生成效率和数值精度,旧版
RandomState也保留了Box-Muller作为可选实现。 - 泊松分布:会根据分布参数λ的值动态切换算法:
- λ小于30的场景下使用Knuth逆变换采样法
- λ大于等于30的场景下切换为Hormann转换拒绝法,避免大参数下逆采样效率大幅下降的问题
所有算法选择的核心逻辑都是在保证随机数分布符合统计标准的前提下,尽可能提升生成速度,逆采样仅在计算代价足够低的场景下才会被直接使用。
内容的提问来源于stack exchange,提问作者Steven Oh
相关产品推荐
相关产品推荐

