面试题之三门问题
本篇文章用以收录个人面试中遇到的问题和刷题中的知识点。
三门问题
问题: 有 4 扇门,背后藏了三只羊和一辆车,假如你选了 1 号门。此时主持人开了一扇门(3 号),背后是一只羊,请问你会不会选择重选?
这题其实我的直觉用逆向思维挺对的,然而还是写错了 GG,其实想想直接列举可能会快的多,而且清晰明了。
这道题的原题是三门问题亦成为蒙提霍尔问题。我看完了一堆的回答,我觉得这个解释会通俗易懂点。
最初选择羊是 3/4 的概率,你最后再选羊(输的)的机会就是 1/4(一开始选中车)+1/8+1/8+1/8=5/8 5/8 > 3/4,重新选择后选到羊的概率会下降,所以应该重选。
把这个问题变化下,56 张扑克牌选一个大王,现在去掉了 54 个不是大王的牌,问你会重新选择么? 这就很明显的对比出来了,肯定会选择换。
这里强调的是这个一个概率问题,概率是大样本下的情况,不考虑单一情况,是以最大概率获胜为选择。
** 全部举例可能 (c:车 y:羊 √:选择 X:打开 -:换到) **
C | y1 | y2 | y3 | P |
---|---|---|---|---|
√ | X | - | - | 输 :1/12 |
√ | - | X | - | 输 :1/12 |
√ | - | - | X | 输 :1/12 |
- | √ | X | 赢: 1/16 | |
√ | X | - | 输: 1/16 | |
- | √ | X | 赢: 1/16 | |
√ | - | X | 输: 1/16 | |
- | X | √ | 赢: 1/16 | |
X | √ | - | 输: 1/16 | |
- | √ | X | 赢: 1/16 | |
- | √ | X | 输: 1/16 | |
- | X | √ | 赢: 1/16 | |
X | - | √ | 输: 1/16 | |
- | X | √ | 赢: 1/16 | |
- | X | √ | 输: 1/16 |
赢的概率 3/8 > 不换的 2/8
---
--- Generated by EmmyLua(https://github.com/EmmyLua)
--- Created by hasee.
--- DateTime: 2018/9/21 8:54
---三门问题(蒙提霍尔问题)
---
function montyHallProblem()
count = 0 -- 胜利次数
times = 1000000 -- 100 万次
for i = 1, 1000000 do
doors = { 0, 0, 0, 0 } -- 4扇门
_index = math.random(1, 4) -- 随机放车 (车:1 羊:0)
doors[_index] = 1
_select = math.random(1, 4) -- 随机选择门
while true do
_delete = math.random(1, 4) -- 随机打开的门
if _delete == _select then -- 不能是被选择的门
goto continue
end
if doors[_delete] == 1 then -- 不能是有车的门
goto continue
end
while true do
_switch = math.random(1, 4) -- 随机换到的门
if _switch == _select then -- 不能是被选择的门
goto continue_1
elseif _switch == _delete then -- 不能是被打开的门
goto continue_1
elseif doors[_switch] == 1 then -- 选择的门后有车 count+1
count = count + 1
break
else
break
end
:: continue_1 ::
end
break
:: continue ::
end
end
io.write("p = " .. count / times)
end
for i = 1, 4 do
montyHallProblem()
io.write("\n------------------\n")
end
io.write("3/8 = "..3/8)