最近在网上看到一个三门问题,感觉很有意思,这个问题是这样的:说你在参加一个抽奖节目,在你的面前有三道门,其中一道门里有价值百万美金的奖品,而其余两扇门则空空如也。你可以任选一道门,然后主持人会在剩余的两扇门里打开一扇空门,这时候问你要不要换一扇门。
乍一看这个问题好像换不换都无所谓,因为根据人的直觉,概率都是1/3嘛!但是我觉得可能没有这么简单,于是就用计算机编写程序模拟了一下。
public class Test {
public static void main(String[] args) {
double scs = 0.0;
for (int i = 0; i < 100000; i++) {
if(door(true)){//传入true表示要换门
scs++;
}
}
System.out.println(scs / 100000);
}
public static boolean door(boolean flag) {
Random r = new Random();
int n = r.nextInt(3);
Random user = new Random();
int choose = user.nextInt(3);
if (flag) {
return choose != n;
} else {
return choose == n;
}
}
}`
虽然计算机没有办法做到真正随机模拟,但是从宏观的概率上讲,应该是能反映一些事实的。在编写程序的时候,我一开始想的是要把主持人打开空门的环节给加上,但是写到最后发现完全没有这个必要。因为主持人为你打开剩余一扇空门这件事完全就是独立于整个系统之外的事情,对最后的概率完全不会产生任何影响。你选择换或者不换,最后的结果都是既定的事实,而不会因为主持人的行为而产生变化。(如果不信的话可以自行写一个模拟三门问题的程序,看看最后化简后的程序是不是和我差不多)。
最后经过我多次的模拟(每次模拟10w次),发现选择换门的话,选择成功的概率高达60%多!而且这个结果非常稳定。
那么,这是为什么呢?感觉十分的有悖直觉。这时候我们通过观察发现,原来我们的程序已经解释了一切!
我们首先创建了一个随机数,随后又创建了一个毫不相干的随机数。这对应着三门中随机一个正确门的编号,和我随机选择的门的编号。然后,如果我们选择换门的话,我们只需要看看我们一开始随机选择的随机门是不是和正确的门不相等就行了,因为主持人已经打开了一扇空门,而我如果选择换门的话,那么看的就是我的号码和正确的号码不相等的概率有多大。如果我一开始选择的号码和正确的门的号码不相等,那么我将换到正确的门上。很明显,在1,2,3中随机生成两次数字,这两个数字不相等的概率要大一些。
所以,三门问题中,如果选择换门的话,赢的概率大!
所以三门问题我们将它抽丝剥茧之后,发现它就是一个判断在一定范围内的两个随机数是否相等的概率问题。