前几天通过掘金投了心知科技的简历,今天收到了电话。
晚些时候约好了和心知科技的长得挺帅的小哥“聊了聊”,
小哥问了我一个这样的问题,当时也没好好分析,下面我总结一下。
三门问题
参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门会否增加参赛者赢得汽车的机率?
我的解法
要是直接按照概率论讲明也太麻烦了,所以,我们来测试它几千万次,看看结果呗。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44//换了的正确次数
let resultChange = 0;
//不换正确的次数
let resultUnChange = 0;
//所有正确的结果
let randomList = {};
let doorSize = 3;
for(let i=0;i<10000000;i++){
let randomPrise = Math.floor(Math.random()*doorSize); //真正奖品存在的门
let randomSelect = Math.floor(Math.random()*doorSize);//你第一次选的门
let removeSelect = null;//主持人帮我排除掉的选项
if(randomPrise in randomList){
randomList[randomPrise]++;
}else{
randomList[randomPrise] = 1;
}
/**
* 帮我排除一个选项,
* 如果这个选项是我选的,则不排除
* 如果这个选项不是选的,但是是奖品,不排除
*/
for(let j=0;j<doorSize;j++){
if(j===randomSelect){
continue;
}
if(j===randomPrise){
continue;
}
removeSelect = j;
}
//换了正确
if(randomPrise!==randomSelect&&randomPrise!==removeSelect){
resultChange++;
}
//不换正确
if(randomSelect===randomPrise){
resultUnChange++;
}
}
console.log(randomList);
console.log('换了的正确率',resultChange/10000000);
console.log('不换的正确率',resultUnChange/10000000);
结果如下:1
2
3{ '0': 3333844, '1': 3334541, '2': 3331615 }
换了的正确率 0.6666581
不换的正确率 0.3333419
很容易看出来啊,当然换了好。
从概率论方面解读
首先,汽车放到哪个门后如果用一个数组可以表示成这样,[0,1,0]
那么可能的结果会是:
[1,0,0]
[0,1,0]
[0,0,1]
这三种,其实我们第一次选择哪个都不影响最终的概率,所以,我们就假设:
我们第一次选的数组的第一个元素,那么我们分析一下:
选项 | 主持人去掉一个后的结果 | 换能拿到汽车 |
---|---|---|
[1,0,0] |
[1,0] |
× |
[0,1,0] |
[0,1] |
√ |
[0,0,1] |
[0,1] |
√ |
很明显,换的概率是 66.67% ,不换 33.33%。