三门问题变体
#百万英雄
#背景:
你参加了一个游戏,在你面前有4张100万支票,其中1张是真的。游戏开始,你选了一张,之后主持人在剩下的3张里,选择一个展示出来,验证后发现是假的。
#问题:请分情况理性分析,此时,你的参赛权的价格
- 情况1:不允许改之前选择
- 情况2:有重新选择的权力
#回答:请用下面两种方式分别作答
- 方式1(理论推导):请给出理论推导及计算过程,情况2需说明如何行使权力。
- 方式2(编程模拟):请用一个你不熟悉的脚本语言,客观、准确、完整的模拟上述两种情况下(例如:模拟1万次),选手平均获得的奖金,得到参赛权的价格。
注意事项
- 编程模拟时,请不要引入任何主观想法,确保模拟客观、准确、完整,并与理论推导独立,即使是2选一,50%概率这种也不要在代码中体现,而应随机模拟二选一,避免把代码变成理论推导的公式计算器,能够达到相互验证的作用。
- 时间不限。考验的是交付能力,请确保在交付时已彻底解决,有100%自信能够面对与自己解答不符的观点,并通过讨论指出其中的问题。
#我的瞎几把答:
这个问题非常类似 “三门问题”、Monty Hall problem。
#我对问题做出两个前提:
- 问题中所描述的 “你选了一张,之后主持人在剩下的3张里,选择一个展示出来,验证后发现是假的”,我暂且认为主持人一定会选择一张假的,而不是随机选择一张。
- 问题是求 “参赛权的价格”,我暂且认为是求中奖的概率,而价格我们则统一认为它的计算公式是 [ 参赛权的价格 = 参赛的唯一最大利益 * 中奖几率 ]
#情况一:不允许改之前选择
理论推导:
四张支票,一张真,三张假,所以抽出一张,
在主持人未公布假支票之前,抽出真支票的概率为 1 / 4 = 0.25,
主持人公布后,理论上抽中支票的概率变成了 1 / 3 = 0.33,
但实际上,在抽的那一刻,是基于 1 / 4 = 0.25 的概率进行风险统计和决策的,所以真正付出的风险是 1 / 4 = 0.25,
而且,由于没有改变选择的权利,且,0.25是基于决策的概率,而0.33是基于部分既定结果的概率,所以实际上你赢奖的概率并没有因为概率基数的减少而增大。
所以,在不允许改变选择的情况下,你真正的中奖概率是 1 / 4 = 0.25,参赛权的价格为 100 * 0.25 = 25万
编程模拟:
python
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
import random
def game():
# 支票
cheques = [False, True, False, False]
# 抽支票并直接返回
return random.choice(cheques)
def doGame():
wins = 0
loses = 0
count = 10000
for i in range(count):
win = game()
if win:
wins += 1
else:
loses += 1
print('共进行了', count, '次抽奖;')
print('中奖场次:', wins, '场', round(wins / count * 100, 2), '%')
print('失败场次:', loses, '场', round(loses / count * 100, 2), '%')
print('根据概率计算的 参赛权价格约等于', round(wins / count * 100, 2), '万')
doGame()
#情况二:有重新选择的权力
理论推导:
同上,主持人公布假支票后,等于减少了一个概率基数,
因为在这一刻,抽奖者拥有了一次重新选择的机会,由于这时基数已减少,所以,理论上,只要再次决策,
接下来的决策胜利的概率则变成了 1 / (4 - 1) = 0.33,
前提是,你需要做出决策(重新选择),新的决策会基于 1 / (4 - 1) = 0.33 的概率,中奖的概率会增加 0.33 - 0.25 = 0.08,
重新决策 与 不重新决策的区别:
重新决策:基于 1 / (4 - 1) = 0.33 的概率进行选择
不再决策:保持基于 1 / 4 = 0.25 概率做出的选择
所以,0.33 > 0.25,理论上,重新选择的胜率会高于不重新选择的胜率。
但实际上,即便是新的决策,你依然可能会选择当下已选支票;若如此,选择没有任何变化,概率却变了;
所以,概率并不是因为你的重新决策而变化,而是因为客观基数变化而变化;
上面的假设之所以也成立,是因为 “基于上次概率作出的决策结果” 恰恰也是 “本次决策概率的基数之一”;
试想,如果“重新选择”这个问题,改为分别给你两场抽奖机会,一场 0.33,一场 0.25,瞬间就不会觉得概率与事实上的悖论了。
所以,要换,换的话,参赛权的价格为 100 * 0.33 = 33万。
编程模拟:
python
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
import random
def switchGame(switch):
# 支票
cheques = [False, True, False, False]
# 抽一支支票
choose = random.choice(cheques)
# 主持人公布(删除)一个假支票
cheques.remove(False)
# 如果选择更换选择,则重新选择一次
if switch:
choose = random.choice(cheques)
# 返回抽奖结果
return choose
def doGame(switch):
wins = 0
loses = 0
count = 10000
for i in range(count):
win = switchGame(switch)
if win:
wins += 1
else:
loses += 1
print('共进行了', count, '次', '重选' if switch else '不重选', '抽奖;')
print('中奖场次:', wins, '场', round(wins / count * 100, 2), '%')
print('失败场次:', loses, '场', round(loses / count * 100, 2), '%')
print('根据概率计算的 参赛权价格约等于', round(wins / count * 100, 2), '万')
doGame(True)
doGame(False)






“验证后发现是假的” 关键问题在于,这是真验证还是假验证 三门问题是假验证,从而保证主持人抽出来的全是假的 如果是真的,就要考虑主持人抽出真的情况,问题就会变得复杂而不单纯
Great
回复:
😌
收藏了 🦅爆了
😃😂😂
参赛权价格~