如何高效生成大参数下的Bates分布随机数?
高效生成大参数Bates分布随机数的方法
Bates分布定义为n个独立[0,1]均匀分布随机变量的均值,等价于Irwin-Hall分布(n个均匀变量的和)除以n。针对n极大(如10000000)的场景,直接生成n个均匀变量再取均值的方法内存开销巨大、耗时极长,以下是两种可行的优化方案:
1. 正态近似法(推荐,超高效)
当n足够大时,根据中心极限定理,Bates分布会近似服从正态分布,参数为:
- 均值:$\mu = 0.5$
- 方差:$\sigma^2 = \frac{1}{12n}$
直接用正态分布生成样本即可,n越大,近似效果越好。Python代码示例:
import numpy as np m = 10000 n = 10000000 mu = 0.5 sigma = np.sqrt(1 / (12 * n)) bates_random_numbers = np.random.normal(mu, sigma, size=m)
这种方法时间复杂度为O(m),完全不依赖n的大小,彻底避开了生成海量均匀变量的开销。
2. 精确生成方案(仅需严格精确性时考虑)
如果必须生成严格符合Bates分布的样本,可先生成Irwin-Hall分布的随机数(n个均匀变量的和),再除以n。但n极大时,Irwin-Hall分布本身已趋近于正态分布,近似法的精度完全满足绝大多数场景需求;且针对n=1e7这种量级,即使是Irwin-Hall的高效生成方法也难以匹敌正态近似的效率。
原代码的小优化(仅适用于小n场景)
若处理的n不算极端大,可通过numpy向量化操作替代列表推导提升原代码效率:
a = np.random.uniform(0, 1, size=(m, n)) bates_random_numbers = a.mean(axis=1)
但该方法在n=1e7时会直接耗尽内存(需存储1e11个浮点数),仅适合小n场景。
内容的提问来源于stack exchange,提问作者shaun
相关产品推荐
相关产品推荐

