Excel中使用拼接配合VLOOKUP实现蒙特霍尔模型时出错
解决Excel蒙特霍尔模型中Monty Opens列的匹配bug
问题拆解
你用纯Excel公式搭建了蒙特霍尔概率模型,模拟《Let's Make a Deal》节目场景:3扇门中选奖品,主持人打开非选手所选的空门,换门胜率为2/3。表格4列里,Monty Opens列在Prize hidden=3且You pick=1时出现bug——本该返回2,却返回了1。你通过拼接辅助列+VLOOKUP实现双列匹配,怀疑是3-1的拼接值误匹配到了第23行的内容。
可行修复方案
1. 给VLOOKUP开启精确匹配
VLOOKUP默认是近似匹配(未指定第4参数时),这会让文本格式的拼接值(比如3-1)被错误匹配到开头相似的内容(比如1-2)。直接修改公式,把第4参数设为FALSE,强制精确匹配:
=VLOOKUP(A2&"-"&B2, 查找区域, 返回列数, FALSE)
另外,把拼接分隔符换成非数字字符(比如|)更稳妥,比如辅助列用=A2&"|"&B2,彻底避免数字拼接带来的歧义。
2. 抛弃VLOOKUP,用直接公式硬编码逻辑
蒙特霍尔的Monty Opens逻辑其实不需要查找表,直接用公式就能搞定,简单还无bug:
- 当你选中奖品门(
A2=B2):随机返回剩下两个空门中的一个,公式可以写:=IF(RANDBETWEEN(1,2)=1, IF(A2=1,2,1), IF(A2=3,2,3)) - 当你没选中奖品门(
A2<>B2):直接返回既不是奖品门也不是你所选的门——因为1+2+3=6,用6-A2-B2就能算出第三个数,一步到位!
把两个逻辑整合为一个公式:
=IF(A2=B2, IF(RANDBETWEEN(1,2)=1, IF(A2=1,2,1), IF(A2=3,2,3)), 6-A2-B2)
如果用的是Excel 365,还能简化成:
=IF(A2=B2, CHOOSE(RANDBETWEEN(1,2), FILTER({1,2,3}, {1,2,3}<>A2)), 6-A2-B2)
3. 排查辅助列的匹配异常
如果坚持用辅助列+VLOOKUP,检查两个关键点:
- 所有行的辅助列拼接格式必须完全一致,不能出现手动输入的错误值
- 确认查找区域的范围没有包含多余行(比如第23行的拼接值是不是
1-xxx,导致近似匹配时被误判)
验证方式
批量生成几百上千行数据,统计Prize hidden=3且You pick=1时Monty Opens的返回值,确认全部为2;再统计换门成功的次数,应该接近总次数的2/3,以此验证模型的正确性。
内容的提问来源于stack exchange,提问作者mikem302
相关产品推荐
相关产品推荐

