三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let’s Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门是否会增加参赛者赢得汽车的机率。如果严格按照上述的条件,那么答案是会。不换门的话,赢得汽车的几率是1/3。换门的话,赢得汽车的几率是2/3。
int bingo = 0; int total = 1000000; // 改变选择 for(int a=0;a<total;a++){ LinkedList door = new LinkedList(); Random random = new Random(); int key = random.nextInt(3); for(int i = 0; i<3; i++){ if(i == key){ door.add("car"); }else { door.add("sheep"); } }
int choose = random.nextInt(3); door.remove(choose); door.add(choose,"choose"); int open; while (true){ open = random.nextInt(3); if(open != choose && !door.get(open).equals("car")){ break; } }
int finalChoose; while (true){ finalChoose = random.nextInt(3); if(finalChoose != choose && finalChoose != open){ break; } } if (door.get(finalChoose).equals("car")){ bingo++; } } System.out.println("改变策略 P = " + bingo + "/" + total); System.out.println("改变策略 P = " + (bingo*1.0 / total));
// 不改变选择 bingo = 0; for(int a=0;a<total;a++){ LinkedList door = new LinkedList(); Random random = new Random(); int key = random.nextInt(3); for(int i = 0; i<3; i++){ if(i == key){ door.add("car"); }else { door.add("sheep"); } } int choose = random.nextInt(3); if (door.get(choose).equals("car")){ bingo++; } } System.out.println("不改变策略 P = " + bingo + "/" + total); System.out.println("不改变策略 P = " + (bingo*1.0 / total));
运行结果:
1 2 3 4
改变策略 P = 666635/1000000 改变策略 P = 0.666635 不改变策略 P = 334133/1000000 不改变策略 P = 0.334133