Box-Muller变换代码返回NA值,求问题排查帮助
Box-Muller变换返回NA的问题排查与解决
问题根源
你的代码返回NA的核心原因有两个:
runif(100, 0, 1)可能生成0值,log(0)会返回-Inf,导致-2 * log(u1)变成Inf;如果此时cos(2*pi*u2)为负数,Inf * 负数会得到-Inf,对负数开平方直接返回NA。- 没必要用
mapply和自定义函数,R的数学函数本身支持向量化运算,逐元素调用反而容易出现隐式问题。
修正方案
1. 规避0值
将runif的下限设为极小正数,确保u1不会取到0:
# 生成100个(1e-10, 1)区间的均匀分布随机数 u1 <- runif(100, 1e-10, 1) u2 <- runif(100, 0, 1)
2. 向量化实现(彻底避免循环)
直接利用R的向量化特性计算,无需自定义函数和mapply:
# 直接计算Box-Muller变换的两个结果 x1_vals <- sqrt(-2 * log(u1)) * cos(2 * pi * u2) x2_vals <- sqrt(-2 * log(u1)) * sin(2 * pi * u2)
验证
运行修正后的代码,x1_vals和x2_vals都会返回符合标准正态分布的数值,无NA。可以通过hist(x1_vals)或qqnorm(x1_vals)验证分布特性。
内容的提问来源于stack exchange,提问作者pandasandnumpy
相关产品推荐
相关产品推荐

