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

基于逆CDF方法的R函数pr1编写问题求助

解决你的逆CDF模拟R函数问题

Hey there! 首先得给你点个赞,你推导的逆CDF公式完全正确!咱们再理一遍:原CDF在10<x<20时是 $F_X(x) = \frac{(x-10)^3}{1000}$,令 $u=F_X(x)$ 解出 $x=10(1+u^{1/3})$,这个步骤一点毛病都没有。

接下来我帮你补全并写出正确的pr1函数,顺便解释每个环节:

pr1 <- function(n) {
  # 生成n个(0,1)区间的均匀随机数——逆CDF方法的核心就是用均匀分布映射目标分布
  u <- runif(n)
  # 用你推导的逆公式计算对应样本值
  x <- 10 * (1 + u^(1/3))
  # 返回生成的随机样本
  return(x)
}

怎么验证函数是否靠谱?

你可以生成一个大样本,把经验CDF和理论CDF画出来对比,一眼就能看出对不对:

# 生成10000个样本(样本量越大,经验CDF越贴近理论值)
sample_data <- pr1(10000)
# 绘制经验CDF
plot(ecdf(sample_data), main = "经验CDF vs 理论CDF", xlab = "x", ylab = "F(x)")
# 叠加理论CDF曲线
curve(ifelse(x <=10, 0, ifelse(x <20, (x-10)^3/1000, 1)), 
      from = 5, to = 25, add = TRUE, col = "red", lwd = 2)
# 加个图例区分两条线
legend("topleft", legend = c("经验CDF", "理论CDF"), col = c("black", "red"), lty = c(1,1), lwd = c(1,2))

如果两条线几乎重合,就说明你的函数工作完全正常啦。

可能踩坑的地方

如果你之前的代码报错,大概率是这些小问题:

  • 函数定义时没加{}包裹代码块,R语法对这个很严格;
  • 计算时运算符优先级搞错了,比如把10*(1+u^(1/3))写成10*1+u^(1/3),结果就完全错了;
  • 另外,R里开三次方用u^(1/3)完全没问题,因为runif生成的u都是(0,1)之间的正数,不用担心负数开方的问题。

内容的提问来源于stack exchange,提问作者Han

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:15:57