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
相关产品推荐
相关产品推荐

