zoukankan      html  css  js  c++  java
  • 面试题之三门问题

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

    三门问题

    问题: 有 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("
    ------------------
    ")
    end
    
        io.write("3/8 = "..3/8)
    
    
  • 相关阅读:
    【leetcode】Sum Root to Leaf Numbers(hard)
    【leetcode】First Missing Positive(hard) ☆
    【leetcode】Next Permutation(middle)
    【好玩的应用】QQ连连看辅助工具
    【leetcode】Binary Tree Preorder Traversal (middle)★
    【leetcode】Reverse Words in a String(hard)☆
    【leetcode】Same Tree(easy)
    【leetcode】Factorial Trailing Zeroes(easy)
    【leetcode】Maximum Gap(hard)★
    Behavioral模式之Chain of Responsibility模式
  • 原文地址:https://www.cnblogs.com/ZeroyiQ/p/12101834.html
Copyright © 2011-2022 走看看