万字长文彻底说清双信封悖论 (通俗解释与程序模拟)
双信封悖论是耶鲁管理学院Barry Nalebuff博士1988年发文提出来的一个博弈悖论,进而在1989年发文给出了对该悖论的解答。参见他的文章《谜题:信封总是别人的好》(Puzzles: The Other Person's Envelope is Always Greener)。
我在这里把原文对问题的描述简化翻译如下(没错,假设人物就是阿里Ali和巴巴Baba,原文如此):
你在一个信封中塞入一些钱(例如10美元),交给阿里,然后你抛硬币决定在另一个信封中装入一半或两倍的钱(即5美元或20美元),然后交给巴巴;他们不知道信封里的内容(但他们知道一个信封是另一个的一半或者两倍)。现在,允许阿里和巴巴私下打开信封,并且如果两人都同意的话,可以交换信封。阿里看到10美元,心想巴巴的信封里要么有5美元,要么有20美元,期望值是12.5美元;因此交换是合算的,平均来说可以赚25%。另一边,巴巴不管看到自己信封里有多少钱,也同样认为阿里信封的期望值比自己拿到的多25%;因此巴巴也认为交换是合算的。那么问题来了:既然阿里和巴巴都认为交换是合算的,那么交换后究竟谁赚了谁亏了呢?
Nalebuff博士正式采用了两个信封来描述问题,故事也比较清楚。实际上,双信封悖论有多种版本,最早可以倒推至1953年,那时讨论的是富人的钱包。关于各种版本和各种解答,在维基百科相关词条(Two envelopes problem)中有更多信息。目前维基百科把基本版本定义为交换信封之前不允许打开信封查看。
查阅维基百科、知乎和网上各种文章,可以发现对双信封悖论的争论是非常多的。诚然,从统计学的角度,可以很严谨地进行公式推导计算,但如何通俗理解,或者仅用最简单的概率计算(就是说要跟悖论本身中的计算一样简单),却不那么容易。
实际上,要想通俗理解对双信封悖论的解释,封装和选择信封的具体操作步骤是很重要的。人们往往因为对操作模式的假设有所不同,容易导致无休止的争论。也正因为如此,才会产生对双信封悖论的解释有很多种版本。
所以基于各种文章、各种解释,我们不妨把操作模式归纳为下面的四种。并且,为了简单起见,只要阿里一个人就可以了,不需要巴巴,即问题归结为:如果你是阿里,你认为交换会带来额外收益吗?
这四种模式是:
盲猜模式:此即维基百科的基本版本模式。在决定是否交换前,不可以查看信封内容。
量子模式:像薛定谔的猫一样,另一个信封里的钱是在你决定交换之后才随机产生的,但保证是你拿到的信封里钱的一半或两倍。我们会看到,这种模式是唯一可以获得额外收益的模式。而悖论产生的根本原因,就是因为我们把所有其他模式都想当然地理解成了这种模式。
老板模式:这个就是Nalebuff博士文章中所描述的模式,打开所选信封后再决定换不换,不过这里去掉了第二个人物巴巴。你可以理解为这是老板给阿里发奖金时开的一个玩笑。与盲猜模式相比,虽然存在是否先打开看的区别,但本质上是一样的。
上帝模式:很多人会讨论这种情况,即事先有很多很多对信封,比如几万对,然后随机挑一对给你再做选择。前面老板很忙,只做了一对信封,但上帝可以做这么多信封给你玩,所以我把这个叫上帝模式。我们会看到,上帝模式跟盲猜模式或老板模式也没什么本质区别。
下面在解释上述四种情形的同时,把每种情形都进行Python编程模拟,以便更好地理解。因为程序要用到随机数,先导入随机数模块:
import random
1. 盲猜模式
盲猜模式的细节过程描述参见维基百科:你拿到两个长相一样的信封,一个里面的钱是另一个的两倍。
你先选择了其中一个信封,假如里面的钱是A(你不知道具体是多少),考虑到另一个信封的钱是0.5A,或者2A,概率相等,因此另一个钱包中钱的期望值是(0.5A + 2A) / 2 = 1.25A。也就是说选择交换的话,可以多得25%的钱(期望值)。但换了之后,假设里面钱是B(你不知道具体是多少),再做计算,发现如果换回去的话,获得钱的期望值同样是1.25B。看起来换回去更合算,所以你要再换回去吗?这样你岂不是就要在“换B、换回A、换B、换回A...“的无限循环中痛苦终生了?
真的如此吗?我们用程序模拟一下换或者不换究竟有没有差别。严格模拟上述过程,随机拿一个信封装入随机数量的钱(假如是0~100的均匀分布),再在另一个信封中装入两倍的钱;然后你抛硬币选择一个信封,并分别统计换或者不换能得到的钱;最后除以总试验次数求平均,并比较换或者不换所得到的钱的平均值。
# 初始化两个累计器,分别用于累计不交换信封和交换信封能获得的钱的总和 sum_keep = 0 sum_swap = 0 # 初始化两个空信封 envelope = {1: 0, 2: 0} # 做100万次实验 trials = 1_000_000 for _ in range(trials): # 装信封,随机拿一个信封放入一些钱(不超过100),另一个则放入两倍 if random.choice([1, 2]) == 1: envelope[1] = random.random() * 100 envelope[2] = envelope[1] * 2 else: envelope[2] = random.random() * 100 envelope[1] = envelope[2] * 2 # 抛硬币选择一个信封,并分别累计换或者不换能得到的钱 your_choice = random.choice([1, 2]) if your_choice == 1: keep = envelope[1] swap = envelope[2] else: keep = envelope[2] swap = envelope[1] # 分别累计本次试验交换和不交换信封所获得的钱 sum_keep += keep sum_swap += swap # 求平均,打印换与不换的最终结果,并进行比较 print(sum_keep/trials, sum_swap/trials, sum_swap/sum_keep)
74.9921095852391 74.93120324318593 0.999187829994515
实验发现,换与不换,100万次试验的平均值是一样的,都是75左右。怎么来的?很好算:其中一个信封0~100,平均50;另一个信封0~200,平均100;拿到两个信封的概率是一样的,总平均 (50+100)/2 = 75。而且,换与不换都是这样子的。
那么悖论中所说的25%额外收益为什么不存在?概率上怎么解释?
从上面的实验过程可以看出来,在任何一次具体的实验中,两个信封并不对称。所以这里最好不要叫A、B信封,我们把0~100的那个叫基础信封,0~200的那个叫倍乘信封。当你拿到基础信封时,你选择换的话确实可以如前所述获得25%的额外期望收益。但是,当你拿到倍乘信封时,有两种可能:
你拿到了0~50之间的值,此时你选择换,也是可获得25%的额外期望收益。这种情况在倍乘信封中有1/4的概率。
你拿到了50~200之间的值,此时你选择换,则必然损失50%的收益(因为基础信封的值不可能超过100,所以只可能是你的一半)。这种情况在倍乘信封中有3/4的概率。你一开始拿到基础信封和倍乘信封的概率各1/2。所以最终结果是:
0.25 * 1/2 + (0.25 * 1/4 - 0.5 * 3/4) * 1/2
这个式子,你可以自己心算一下,结果恰好是0!所以在悖论中,错误就在于忽视了倍乘信封在50~200这个区间交换是负收益的状态。
当然,在整个实验过程中,作为试验对象的你,并不知道这些数值范围的存在,不知道最大值是多少。但这些范围确实是存在的,尽管具体是多少不重要。正所谓当局者迷啊。
实际上,作为参与实验的对象,心里一定想的是:无论我拿到多少,另一个信封要么是我的0.5倍,要么是我的2倍,且概率相等。这种想法可以成立,但需要是下面要讨论的量子模式。
2. 量子模式
在量子模式中,在打开信封的瞬间,信封里的钱才随机产生,并且要保证后一个信封的钱是前一个信封(已打开)的一半或者两倍。
sum_keep = 0 sum_swap = 0 trials = 1_000_000 for _ in range(trials): opened = random.random() * 100 non_opened = opened * random.choice([0.5, 2]) sum_keep += opened sum_swap += non_opened print(sum_keep/trials, sum_swap/trials, sum_swap/sum_keep)
50.006016376365615 62.510531953517834 1.2500602224148019
可以看到,在量子模式下,先打开一个然后选择换的话,是确实能拿到1.25倍的钱的,符合大家的期望。这个是比较好解释的,因为是量子事件,A信封与B信封的产生实际上是独立事件。因此,B信封的收益可以通过简单平均求期望值,即:
(0.5 + 2) / 2 = 1.25
当然,这种“瞬间产生”的模式,实际上也是用扔骰子的方式决定,我用“量子”这个名字,只是更加直观,像“薛定谔的猫”一样,在打开箱子的瞬间,才能确定猫的生死。关键点还是在于要在当事人作出交换的决定后,才决定这个信封里的钱是多少。明眼人也看出来了,这实际上是无条件概率和条件概率/先验概率之间的区别,这里不展开。
你可能还注意到,如果用这种方式发奖金的话,你比前面的盲猜模式怎么都拿得少。这里的秘密我就不解释了,自己琢磨吧。
3. 老板模式
在老板模式下,老板先包好一个红包,跟前面一样,还是0~100之间。然后自己先扔硬币玩一下,正面的话就在第二个红包中包两倍的钱,反面的话就在第二个红包中包一半的钱。然后给你选,你选一个打开后,还可以决定换还是不换。
sum_keep = 0 sum_swap = 0 trials = 1_000_000 for _ in range(trials): first = random.random() * 100 second = first * random.choice([0.5, 2.0]) your_choice = random.choice([1, 2]) if your_choice == 1: opened = first non_opened = second else: opened = second non_opened = first sum_keep += opened sum_swap += non_opened print(sum_keep/trials, sum_swap/trials, sum_swap/sum_keep)
56.23367734821493 56.18400433176987 0.999116667826337
可以看到,跟盲猜模式一样,交换信封你不会拿到更多的钱。但无论你交换不交换,拿到的钱也不是0~100的平均值50,而是比它多12.5%,好像是把25%公平分给了换与不换两种方式似的。很奇妙是吧?25%这个数一直跟着我们,只不过不是悖论中所说的那么简单。
那么交换不能拿到额外收益的原因是什么呢?本质上与盲猜模式一样,原因是你有一半的几率选中的是倍乘信封,而拿到倍乘信封又选择交换的话,有3/4的概率是吃亏50%的。
4. 上帝模式
上帝模式是先包好很多很多的信封对,每一对中的其中一个装的钱为0~100, 另一个是其两倍。每次试验从中随机选择一个信封对,你挑选一个,打开看后再决定是否更换。
本质上,与盲猜模式和老板模式也没有区别,重点仍然在于拿到倍乘信封时,选择交换的话有3/4的概率时吃亏的。以下是实验结果,可以看到无论是否交换,最后拿到的钱的期望值与盲猜模式一样,都是75。
# 先做好5万对包好钱的信封,每一对中的其中一个的钱为0~100,另一个是其两倍 money_preset = [random.random() * 100 for i in range(50000)] envelope_pairs = [{1: m, 2: m*2} for m in money_preset] sum_keep = 0 sum_swap = 0 trials = 1_000_000 for _ in range(trials): envelope_pair = random.choice(envelope_pairs) your_choice = random.choice([1, 2]) if your_choice == 1: opened = envelope_pair[1] non_opened = envelope_pair[2] else: opened = envelope_pair[2] non_opened = envelope_pair[1] sum_keep += opened sum_swap += non_opened print(sum_keep/trials, sum_swap/trials, sum_swap/sum_keep)
75.14579663734666 75.04442534496948 0.9986510051538025
值得一提的是,盲猜模式和上帝模式的基础信封都是0~100,而老板模式的基础信封可能是0~100,也可能是0~50,所以盲猜模式和上帝模式的收入期望值一样,而老板模式的收入期望值低一些。
不同的模式收入期望值不一样,这也从一个角度印证了前文所讲的模式细节的不同会导致争议的原因。也正因为如此,按Wikipedia的说法,目前没有普遍接受的权威解答(No proposed solution is widely accepted as definitive)。本文针对四种比较普遍的模式,给出了容易理解的解释和模拟。如果还有其它值得议一议的模式,欢迎提出商榷。
5. 结论
只有在量子模式,也就是没有事先放好钱的情况下,选择交换才有额外收益。双信封悖论的核心问题,在于假设了事先在信封里装好钱的事实,又基于事先没有装好钱来计算概率。本质上,这是因为把条件概率按照无条件概率来进行计算导致的矛盾。对双信封悖论的理论分析,比较严谨的算法基本上也是从这个角度进行计算的,包括使用贝叶斯概率。
本文讨论的其它三种模式(盲猜模式、老板模式、上帝模式),选择交换都不会有额外收益。具体原因在于当你拿到的是倍乘信封时,选择交换有3/4的概率是亏损的。最终正负抵消,交换信封的收益是0。
本文没有提及无穷的问题。实际上双信封悖论本身,并不涉及无穷。引入无穷的概念来讨论该悖论,实际上增加了问题的复杂性,可能导致更多争议。维基百科中也提到了这一点( Clark and Shackel argue that this blaming it all on "the strange behavior of infinity" does not resolve the paradox at all)。
喜欢我的作品吗?别忘了给予支持与赞赏,让我知道在创作的路上有你陪伴,一起延续这份热忱!
- 来自作者
- 相关推荐