Monty 大厅的问题陈述十分简单,但是它的答案看上去却是有悖常理。该问题不仅引起过很多争议,也经常出现在各种考试题中。
Monty 大厅的游戏规则是这样的,如果你来参加这个节目,那么
(1)Monty 想你示意三个关闭的大门,然后告诉你每个门后面都有一个奖品,其中有一个门后面的奖品是一辆车,另外两个门后面则是不值钱的奖品,例如指甲剪之类的东西。奖品是随机放在三个门后面的;
(2)该游戏的目的是猜中哪个门后面有车,一旦猜中,你就可以拿走汽车;
(3)你先挑选一个门,不妨假设为门 A,其他两个门称为门 B 和 门 C;
(4)再打开你选中的门之前,Monty 会先打开 B 或者 C 中一个没有车的门来增加悬念(如果汽车在门 A 后面,那么 Monty 打开门 B 或者门 C 都是安全的,所以他可以随意选择一个;如果汽车在门 B 后面,那么 Monty 只能够选择门 C)
(5)然后 Monty 给你一个选择,坚持最初的选择还是换到另外一个没有打开的门?
此刻,问题已经抛出来了,是坚持初心还是临时改变?两者之间有没有什么区别?
使用java 代码测试:
1 package hell; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 import java.util.Random; 6 7 public class Main { 8 static Random random = new Random(); 9 public static void test(long times) { 10 long cHit=0,uncHit=0; 11 12 for(long i=0;i<times;++i) { 13 int p=random.nextInt(3); 14 int t=random.nextInt(3); 15 if(t==0) { 16 if(p==0) { 17 ++uncHit; 18 }else { 19 ++cHit; 20 } 21 }else if(t==1) { 22 if(p==1) { 23 ++uncHit; 24 }else { 25 ++cHit; 26 } 27 }else if(t==2) { 28 if(p==2) { 29 ++uncHit; 30 }else { 31 ++cHit; 32 } 33 } 34 } 35 System.out.println("交换:"+(double)cHit/times); 36 System.out.println("不交换:"+(double)uncHit/times); 37 } 38 39 public static void main(String[] args) { 40 System.out.println("1e4"); 41 test((long)1e4); 42 System.out.println("1e6"); 43 test((long)1e6); 44 System.out.println("1e8"); 45 test((long)1e8); 46 System.out.println("1e12"); 47 test((long)1e12); 48 } 49 50 51 }
结果为:
1e4
交换:0.6677
不交换:0.3323
1e6
交换:0.66652
不交换:0.33348
1e8
交换:0.66670149
不交换:0.33329851
1e12(没跑出来)