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

R语言编写生日悖论函数返回结果异常问题排查

错误原因

你的自定义函数出现结果偏差的核心原因是大括号配对错误,导致return()语句被放在了for循环内部:

  • 原未封装脚本中,answer <- event/sims是在1000次模拟循环全部执行完成后才运行的,会统计所有模拟中出现生日重复的总次数再计算概率。
  • 封装后的函数里,for循环的闭合大括号被放到了return(answer)之后,意味着第一次循环执行完就会直接计算answer、触发返回、终止函数运行。第一次循环时event的取值只能是0或1,除以1000得到的结果自然只会是0或者0.001,和预期值偏差极大。
修正方案

把概率计算、结果返回的逻辑移到for循环的外部,确保1000次模拟全部跑完之后再统计结果,修正后的代码如下:

bdayfunction <- function(k){
  sims <- 1000 
  event <- 0 
  for (i in 1:sims) {
    days <- sample(1:365, k, replace = TRUE)
    days.unique <- unique(days) 
    if (length(days.unique) < k) {
      event <- event + 1 
    } 
  }
  # 循环全部跑完再计算概率、返回结果
  answer <- event/sims
  return(answer)
}

运行bdayfunction(23)即可得到约0.5的模拟结果,和未封装脚本的输出一致。

提示:R语言本身不强制要求代码缩进,但大括号的配对位置直接决定了代码块的作用范围,编写循环、分支、自定义函数时建议对齐配对的大括号,避免出现逻辑块嵌套错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:06:34