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