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

一、挑战

你的面前有三个大门(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面试题!

posted @   Hider1214  阅读(256)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示