• 有趣智力题:蒙提霍尔悖论 —— “决定”挑战


    一、挑战

    你的面前有三个大门(A/B/C),其中有一个门背后有5000万的大奖,猜对了就归你!在你做出选择之后(假设选择A),会从剩下的两个门中打开一个没有大奖的门(例如:B),然后问你是否改变最初的选择?

    —— “坚持你的选择!坚持你的选择!”

    —— 不会就蒙C!

    —— 《恐怖游轮》不断重复循环

    二、分析

    换与不换,这是一个问题?

    初步一分析,这TM不就是一个盲选的问题嘛,何来最优选择?

    先说结论:一定要改变选择!!!

    说白了,不改变选择,中奖概率只有1/3,一旦改变了选择,中奖概率就会上升到2/3了。

    换个思路分析一下,总体逻辑其实是一样的。

    假设你现在面前有1000扇门,
    
    只有一扇门背后藏着奖品,
    
    你第一次随便选一个门,
    
    然后主持人会帮你在你没选择的999扇门中打开998扇没有奖品的门,
    
    现在场上还剩你最初选择的那个门,
    
    和主持人帮你排除之后的一个门,
    
    你换不换?
    

    三、模拟实操

    1.定义大奖

    import numpy as np
    import pandas as pd
    # 默认100轮
    def get_random(num=100):
        # 大奖在1/2/3号门随机出现
        lst = np.random.randint(1,4,size=num)
        return lst
    

    2.坚持最初的选择

    盲猜,不改变选择,猜什么最终是什么。

    # 坚持最初的选择
    def guess_one(num=100):
        # 正确答案
        lst = get_random(num)
        guess = np.random.randint(1,4,size=len(lst))
        judge = (lst == guess)
        correct_rate = judge.sum() / len(judge)
        print(f'本次玩了{num}轮,不改变的中奖概率为:{str(round(correct_rate * 100, 4)) + "%"}')
        return None
        
    guess_one(10000)
    # 本次玩了10000轮,不改变的中奖概率为:33.62%
    

    3.改变最初的选择

    先随机选择一个,再打开空门之后,改变选择。

    # 正确答案
    lst = get_random(num=100)
    
    # 随机猜
    guess = np.random.randint(1,4,size=len(lst))
    
    # 改变后的最终选择
    guess_change = []
    
    • 场景一:第1次没猜中
    # 场景一:第1次没猜中
    guess_change = []
    # 改变选择后肯定是正确答案
    for ans, gue in zip(lst, guess):
        # print(ans, gue)
        if ans != gue:
            guess_change.append(ans)
    
    • 场景二:第1次猜中了!
    # 场景二:第1次猜中了
    guess_change = []
    for ans, gue in zip(lst, guess):
        # print(ans, gue)
        if ans == gue:
            # 正确答案范围
            answer_range = [1,2,3]
            # 所猜是对的 先排除
            answer_range.remove(ans)
            # 主持人随机打开1个门
            answer_range.remove(answer_range[np.random.randint(0,2)])
            # 剩下的即是最终选择
            guess_change.append(answer_range[0])
    # len(guess_change)   
    
    • 函数封装
    def guess_two(num=100):
        # 正确答案
        lst = get_random(num=100)
        # 随机猜
        guess = np.random.randint(1,4,size=len(lst))
        # 改变后的最终选择
        guess_change = []
        # 循环判断
        for ans, gue in zip(lst, guess):
            # print(ans, gue)
            if ans != gue:
                # 场景一:第1次没猜中
                # 改变选择后肯定是正确答案
                guess_change.append(ans)
            else:
                # 场景二:第1次猜中了
                # 正确答案范围
                answer_range = [1,2,3]
                # 所猜是对的 先排除
                answer_range.remove(ans)
                # 主持人随机打开1个门
                answer_range.remove(answer_range[np.random.randint(0,2)])
                # 剩下的即是最终选择
                guess_change.append(answer_range[0])
        guess_change = np.array(guess_change)
        judge = (lst == guess_change)
        correct_rate = judge.sum() / len(judge)
        print(f'本次玩了{num}轮,改变策略的中奖概率为:{str(round(correct_rate * 100, 4)) + "%"}')
        return None
    
    guess_two(10000)
    # 本次玩了10000轮,改变策略的中奖概率为:66.0%
    

    四、对比分析

    for i in (10, 100, 1000, 10000, 1000000):
        guess_one(i)
    '''
    本次玩了10轮,不改变的中奖概率为:0.0%
    本次玩了100轮,不改变的中奖概率为:37.0%
    本次玩了1000轮,不改变的中奖概率为:35.2%
    本次玩了10000轮,不改变的中奖概率为:33.38%
    本次玩了1000000轮,不改变的中奖概率为:33.3518%
    '''
    for i in (10, 100, 1000, 10000, 1000000):
        guess_two(i)
    '''
    本次玩了10轮,改变策略的中奖概率为:62.0%
    本次玩了100轮,改变策略的中奖概率为:64.0%
    本次玩了1000轮,改变策略的中奖概率为:71.0%
    本次玩了10000轮,改变策略的中奖概率为:64.0%
    本次玩了1000000轮,改变策略的中奖概率为:65.0%
    '''
    

    一目了然!!!

    参考链接:记一道80%的人会答错的牛X面试题!

  • 相关阅读:
    css相关
    杂题
    vuesheng生命周期
    box-sizing
    js正则学习
    浏览器加载解析过程
    Sass学习笔记
    jQuery与原生js实现banner轮播图
    jq-animate实现返回顶部效果
    jq-animate
  • 原文地址:https://www.cnblogs.com/hider/p/15965005.html
Copyright © 2020-2023  润新知