车与羊的问题,代码模拟实现

血刃飘香 评论 决胜21点 4 2018-06-13 18:36:32
血刃飘香
血刃飘香 2018-06-17 20:15:11

回过头来梳理一下思路 --
其实1/3,2/3的结果也很好理解:在玩家(不换门)和主持人都决定好选择逻辑的情况下,显然玩家会赢当且仅当车在1号门,所以胜率是1/3。
比较难的是,为什么50%,50%的答案是错的?因为在确定有一扇门是羊的情况下,假定车在剩下的两门中分布的概率均等似乎也相当自然啊。
其实影响概率分布的唯一因素是使用什么样的信息,或者换句话说,采用何种假设前提。而提高胜率的唯一办法是尽可能的利用或增加已知信息。在原题目的情景下,完整的可获得信息其实是“主持人在2,3门中排除了一扇有羊的门”,但是我们很容易(题目的表述进一步也许诱导了这种倾向)只使用这样信息:“3号门中是羊”。在第二个假设下,很显然概率就是50%-50%。但是解题当然是要完全利用已知条件的,而在完整的已知条件下,即“主持人在2,3门中排除了一扇有羊的门”,概率就是1/3-2/3。所以正确答案只能是1/3-2/3,即换门更有利。

血刃飘香
血刃飘香 2018-06-17 21:01:28

其实假设说主持人开了3号门,我们很容易地就仅仅看到3号门后是羊,而忽略掉一点,就是主持人会3号门,有两种情况:一是2、3号后面都是羊,主持人随便选的3号;二是2号门后是车,因此主持人只能选3号门,这两种情况的出现比例是1:2。如果一时想不清楚的话,可以这样考虑(我们先假设主持人如果可以选,他的选择是均等的,因为无法知道主持人的实际挑选逻辑,所以这么假设是合理的。不过反正只考虑换门和不换门两种策略,所以主持人怎么选其实无所谓):情况一是“1号门后是车,然后主持人在2、3号中选3号”,所以概率是1/3 * 1/2;情况二是“2号门后是车,然后主持人只能被迫选3号”,所以概率是1/3 * 1;再加上主持人选中2号门对应的两种情况的概率也是同样的1/3 * 1/2和1/3 * 1,总和刚好是1。因为显然换门策略只会情况一下失败,所以失败-胜利概率比就是1:2。
我们可以用代码来验证这个比值:
import pandas as pd
df = pd.DataFrame(doors, columns=['real', 'host_choice', 'player_choice'])
print(df[df['host_choice'] == 3]['real'].value_counts(normalize=True))
输出结果是:
2.0 0.667067
1.0 0.332933

血刃飘香
血刃飘香 2018-06-17 21:42:49

其实从哲学的角度上说,概率是我们对未知事物的一种描述。现实中只会出现一种结果:赢或者输。设想如果有一个全知全能的上帝,因为它知道任何事,对它而言,换门赢的概率要么是100%,要么是0%。所以我们说概率如何,完全取决于我们已掌握的信息。写模拟程序的时候,在决定哪部分是确定的,哪部分是随机变量时,其实我就已经决定了采用什么样的假设。我以上的程序是在完整的信息,即“主持人会在2,3号门中排除一扇有羊的门”的基础上写的,所以得出1/3-2/3的结果。如果有人的程序是这样设定的:让主持人先选定2,3号门中的一扇,然后在剩下的两扇当中随机生成车的所在号码,那他的程序跑出来的结果1/2-1/2 -- 不过正确的答案当然必须在完整的已知条件下推导,所以我们完全可以说他写出来的这个程序是错误的。
不过原题情境和表述还真是有点迷惑性,头脑不清醒的情况下,我即使在写完程序之后也一时没能反应过来。如果换以下这种情境,也许该题会更容易想清楚的一点:
你在参加“百万大富翁”之类的一个答题节目,你面对的这道题目你一点线索都没有,ABCD四个选项看起来都完全有可能。但是你有一个锦囊,它可以帮你在C、D两个选项中排除掉一个错误的选项。那么请问,你应该如何使用这个锦囊?

> 豆瓣违规公示