ZeroyiQ

本篇文章用以收录个人面试中遇到的问题和刷题中的知识点。

三门问题

问题: 有 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)

分类:

技术点:

相关文章: