有这样一个抛硬币的游戏:若第一次抛出正面,你就赚1元;否则继续抛,若第二次掷出正面,你就赚2元;否则继续抛,若第三次掷出正面,你就赚4元;若第四次抛出正面你就赚8元……也就是说,抛出正面时游戏结束;越晚抛出正面,你赚得越多,晚一次就翻一倍。
问:你最多愿意付多少钱参加这个游戏?
结果是令人惊讶的无穷大。但你大多数时候可能只能赚到一两块钱。这是怎么回事呢?
这就是著名的伯努力家族中的数学家丹尼尔·伯努利的堂兄尼古拉一世·伯努利提出的在决策论和经济学上都广为谈论的被称为“圣彼得堡悖论”的问题。
数学解释
你最多愿意付的钱就是这个游戏的预期收益(平均收益)。
你有1/2可能赚到1元钱,1/4可能赚到2元钱,1/8可能赚到4元钱…… 收益分布如下图所示
所以平均收益为:
E = 1x1/2 + 2x1/4 + 4x1/8 + ... = 1/2 + 1/2 + 1/2 + ...
这个求和是不收敛的,结果确实是无穷大。
化解之道
显然没人愿意花无穷多的钱去玩这个游戏,花10元钱也许都会嫌多。
网上关于这个问题的讨论有不少。我觉得关键点就一条:你准备去玩多少局?
如果你准备去玩无穷多局,你的平均收益确实是无穷大;如果你准备玩有限局,你的平均收益是多少呢?
模拟游戏
下面是一个简单的模拟。在Mathematica里只需要一个函数就可以完成。
RandomChoice能根据权重从列表里随机选择,我们构造一个概率的权重列表和一个对应的收益列表就可以模拟这个游戏了。
从这一千万局的模拟游戏可以看到:
- “中大奖”的那一局赚了三千多万;
- 这是硬币连续出现25个反面赚来的;
- 这次中奖出现在第2477560局;
- 整体的收益分布和预期的差不多(确认模拟方法没问题);
- 平均收益接近18元(哎。。)
有个小说明:多局模拟的结果的最大值,反映出连续反面的次数并不是很大(大概30左右),是远远小于500的。所以,在构造列表时,我只设定了这么长;否则列表越大,模拟速度越慢。
平均收益和游戏局数的关系
假设玩N局游戏为一轮,下面模拟了N取值从1〜20000时,每轮的平均收益。
最高的一轮平均收益超过240万,那是第14311轮,也就是说那一轮总共模拟了14311局游戏。这样算下来,那一轮的总收益约240万*14311=343亿元!推测那一轮内出现了连续34次反面。
但是,大部分平均收益看起来还是在10以下!
网上有人说模拟的结果和 log(N)/log(2)比较接近,实际测试的结果看起来和log(N)/2log(2)比较接近,也许那个结论对应的起步价是2元。
寻找公式
至于怎么从理论上推出这个公式,我没找到办法。我们甚至不能求N局游戏平均收益的期望值。因为单局游戏收益的数学期望是无穷大,N局游戏收益的平均值的数学期望当然也是无穷大。
从模拟的数据来看,非常分散,如果我们把N局游戏作为一轮,把这个游戏重复M轮,求其平均值,是否会让数据更集中,从而便于发现公式呢?
答案是否定的,因为这会改变结果。假定我们承认前面的对数关系的公式,就会得出这样做会让平均值变大,为原来的 log(M*N)/log(N)倍。
按照常理,均值应该和N没有关系,但现在的问题就是N越大,均值越大,所以一旦重复多次求平均,得到的结果就不是原来想要的了。
可能有效的办法是求中值(中位数),即重复M轮,只取最中间的那一个数(记住那个数是N局游戏的平均值)。也就是:N局游戏求Mean,然后M个Mean里求Median.
宇宙最强软件Mathematica的FindFormula发现的公式果然也是对数关系的,只不过它默认可能会分段,对它稍做限定,最后得到一个完整的公式:
1.29869 + 0.721556 Log[n]
其实0.721556这个系数和前面的 1/2log2 (0.721348) 是非常接近的。出于数学美的考虑,我们把这个公式修改为:
(2 + Log[n]) / (2 * Log[2])
虽然在这个数值范围内没有拟合公式好,但随着N的增大,它也许会好于拟合公式也未可知,毕竟它看起来更像一个数学公式。不管怎样,这个对数关系应该是确定的。
结语
一局游戏可能抛一次硬币就完成,也可能抛100次才完成,其实不难算出平均是2次。于是我们假设平均一秒钟能完成一局游戏。如果从宇宙诞生那一刻开始玩这个游戏玩到现在,玩了138亿年,根据前面模拟得到的近似公式,我们可以得出平均收益为:
(log(138e8 * 365 * 24 * 3600) + 2) / log(2) / 2 = 30.7(元)
尽管理论上这个游戏的期望收益是无限大,但放在有限的时间内,即使是宇宙级的时间内,其预期的平均收益也才区区31元而已。
所以,我们有限的生命不会被这种无限前提下的无限预期所忽悠。于是,悖论就被瓦解了。