You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 06:35:28