R语言中生成Bates分布随机变量的最快方法是什么?
优化方案
方法一:利用统计性质直接生成近似样本(最快)
当取100万个[1,5]均匀分布的均值时,中心极限定理的近似精度极高,完全可以直接推导参数后用正态分布生成样本,无需每次生成百万级随机数:
- [1,5]均匀分布的均值为
(1+5)/2 = 3,方差为(5-1)²/12 = 4/3 - 1000000个该变量的均值,均值仍为3,方差为
(4/3)/1e6 = 4/(3e6),标准差约为0.0011547
直接生成10000个符合该参数的正态分布样本即可:
set.seed(999) bates_fast <- rnorm(10000, mean = 3, sd = 2/(sqrt(3)*1000)) summary(bates_fast)
这个方法的速度是原代码的几百上千倍,结果和原方法几乎无差异。
方法二:向量化生成所有样本(精确但内存压力大)
如果必须精确生成Bates分布(不依赖CLT近似),可以一次性生成所有随机数再按行求均值,避免循环开销:
set.seed(999) # 生成10000行,每行1e6个[1,5]的均匀数 all_data <- matrix(runif(10000*1e6, 1, 5), nrow = 10000) bates_exact <- rowMeans(all_data) summary(bates_exact)
注意:该方法需要约80GB内存(每个double占8字节,1e10*8≈74.5GB),内存不足时无法使用。
方法三:优化循环细节(比原方法快)
如果内存不够且不想用CLT近似,可优化循环操作:
- 替换
randomLHS为更快的runif,直接指定min=1, max=5,省去额外转换步骤 - 提前分配结果向量,避免循环中动态扩容
- 减少不必要的变量赋值
优化后的代码:
set.seed(999) y <- numeric(10000) for (i in 1:10000) { y[i] <- mean(runif(1e6, 1, 5)) } summary(y)
内容的提问来源于stack exchange,提问作者bprijadi
相关产品推荐
相关产品推荐

