R语言计算20人排列中A、B相邻概率的代码问题排查
问题排查与修正
核心问题
你的f1()函数存在致命逻辑错误:无论循环中是否检测到1和2相邻,函数最后都会执行F并返回FALSE。循环里的TRUE只是在条件满足时执行了这个值,但没有提前终止函数并返回,循环结束后直接返回F,导致所有模拟结果都是FALSE,最终概率为0。
修正后的代码
f1 <- function() { x <- sample(1:20, 20, replace = FALSE) for (i in 1:19) { # 检测1和2相邻的两种情况 if ((x[i] == 1 && x[i+1] == 2) || (x[i] == 2 && x[i+1] == 1)) { return(TRUE) # 找到后立即返回TRUE,终止函数 } } return(FALSE) # 循环结束没找到,返回FALSE } prob_p <- function(Nrep) { rs <- replicate(Nrep, f1()) sum(rs) / length(rs) } # 运行模拟 prob_p(100000)
关键修改点
- 在条件满足时用
return(TRUE)直接终止函数并返回结果,而不是只写TRUE - 循环结束后明确返回
FALSE,逻辑更清晰
理论验证
20人排成一排,A(1)和B(2)相邻的理论概率是2/20 = 0.1,修正后的模拟结果会接近这个值,比如10万次模拟后结果应该在0.098到0.102之间浮动。
内容的提问来源于stack exchange,提问作者vanderwaal
相关产品推荐
相关产品推荐

