最近读博弈论相关的书,书中举了一个例子,如下:
你出现在一个游戏节目里,主持人指出标有1、2、3的三道门给你,而且明确告诉你,其中两扇门背后是山羊,另一扇则有一辆名牌轿车,你要从三扇门里选择一个,并可以获得所选门后的奖品。当然你希望自己选中的是汽车而非山羊。既然是三选一,很清楚,你选中汽车的机会就是1/3。
在没有任何信息帮助的情况下,你选了一个(比如1号门),这没有什么对与不对,完全是运气问题。但主持人并没有立刻打开1号门,而是打开了3号,门后出现的是一只羊。然后主持人问你:是否要改变主意选2号门?现在这就是个决策问题了:换还是不换?想一想吧!
赛凡特女士的答案是你应该换,想法大致如下:如果你选了1号门,你就有三分之一的机会获得一辆轿车,但也有三分之二的机会——车子是在另外两扇门后。接着好心的主持人让你确定车子确实不在3号门后,不过1号门有车子的几率还是维持不变,而2号门后有车子的几率变成三分之二。实际上,3号门的几率转移到了2号门上,所以你当然应该改选。
书中说应该换,给出的理由是“几率转移”,这个词就非常让人疑惑,"转移"是什么?怎么转移?
我最开始也是认为不用换,觉得第二次做选择时,两扇门都是二分之一的概率中奖呀。百思不得其解时,看见书的评论有人做实验测试,两个人配合做了50次,得出不换门中奖的概率大概为0.44,但实验者也承认次数有限,误差较大。
那不就到了展现代码魅力的时刻了吗?!~想一想也不复杂,我也不理解为什么作者说概率会为三分之二,那就实践测试一下吧,实践出真知嘛!
用了十来分钟敲的,命名和算法方面可能欠妥,但总体跑起来没问题,足以解释这个问题了。代码如下:
public class Test {
public static boolean chooseDoorNormal() {
boolean isWin = false;
// 1.随机指定礼物在哪扇门后面
Map<Integer, Boolean> doors = creatDoors();
// 2.随机选择一扇门
int choose = (int) (Math.random() * 3) + 1;
System.out.println("选择:第"+choose+"号门");
// 3.查看中奖结果
if (doors.get(choose)) {
isWin = true;
}
return isWin;
}
public static boolean chooseDoorNoExchange() {
boolean isWin = false;
// 1.随机指定礼物在哪扇门后面
Map<Integer, Boolean