R语言蒙提霍尔模拟结果异常:为何胜率未达约66%?
蒙提霍尔问题模拟修正方案
代码中的核心问题
- 变量名不匹配:代码里误用了
vyber1和pozicia_ceny,但实际定义的变量是pick1和price_position,拼写错误导致reveal的计算逻辑完全失效。 - 获胜条件判断错误:Karla选择更换门后,获胜逻辑应为:初始选择未中奖时,更换必中;初始选中时,更换必不中。原代码的判断逻辑完全不符合这个规则。
修正后的代码
Karla_simulation <- function() { # 随机设置奖品位置 prize_position <- sample(1:3, 1) # Karla初始选择一扇门 pick1 <- sample(1:3, 1) # 主持人揭晓一扇无奖且未被选中的门 possible_reveal <- setdiff(1:3, c(pick1, prize_position)) reveal <- sample(possible_reveal, 1) # Karla更换选择:剩下的那扇门 final_pick <- setdiff(1:3, c(pick1, reveal)) # 判断是否获胜 if (final_pick == prize_position) { return(1) } else { return(0) } } repetitions <- 100000 Karla_wins <- numeric(repetitions) for (i in seq_along(Karla_wins)) { Karla_wins[i] <- Karla_simulation() } probability <- sum(Karla_wins)/repetitions probability
修正说明
- 统一变量名:把拼写错误的
vyber1改为pick1,pozicia_ceny改为prize_position(同时修正了price的拼写错误,正确应为prize)。 - 修正主持人揭门逻辑:正确筛选出主持人可揭晓的门——必须是无奖且未被Karla初始选中的门。
- 明确更换选择的逻辑:计算Karla更换后的最终选择,直接判断该选择是否等于奖品位置,完全贴合蒙提霍尔问题中更换选择的获胜规则。
运行修正后的代码,10万次模拟后的获胜概率会接近0.666,符合理论预期。
内容的提问来源于stack exchange,提问作者Ondrej Puškár
相关产品推荐
相关产品推荐

