联合起来变得虚弱

不要怪我犯哗众取宠的毛病,这个题目不是我取的,这是法国著
名的数学科普作家Jean-Paul Delahaye在2001年12月号《为了科学》,
即《科学美国人》的法文版上发表的一篇文章的题目。我觉得这文章
很有意思,觉得很可以介绍给大家;同时也是表达对一位离网隐去不
少时候的朋友的怀念,他和我打过一个赌,而这篇文章,就是谈打赌
问题的。

  在9月号的《为了科学》中,Delahay提出了一个奇怪的问题,并
表示他自己也不太清楚毛病出在了什么地方,希望有兴趣的读者能帮
助他找到一个令人满意的答案。要理解他提出的问题,首先让我们来
看一些基本概念。

  如果有人要和你打赌,比如说抛六面的骰子(当然我们要规定这
个骰子没被灌了某种液体或者有其他的猫腻,我们毕竟是讨论数学问
题,不是真要学好本领去甚至出老千,下面所有的情况都不这么
一一说明了)。如果他建议,抛出1来,他就给你3元,抛出2或3来,
你就给他1元,而其他情况大家不输不赢。那么这个赌你应不应该打
呢?很显然,如果这样的赌多进行几次,那么平均说来,在六次里有
一次抛出1,有两次抛出2或3,有三次抛出其他的数字。所以平均说
来,在六次里你会赢一次3元,输两次1元,于是总的来说你会赢
3-2*1=1元,也就是说平均每次你会赢1/6元。当然偶然某次你会抛到
2或3,输掉1元,但是从长远的角度来看,你会不断地赢钱。所以你
应该接受这样的赌局。

  在数学上,上面的1/6元被称作这种赌局对你来说的期望,就是把
每种可能发生的情况的概率和在此情况下你赢的钱的数目(如果是输,
那么钱为负)乘起来,再把从所有这些情况下计算出的值加起来。一
般来说,期望是正的,赌局对你就有利,如果是负的,那么就对你不
利。而且如果把参加赌局的所有人的期望都加起来,一定是0,因为总
体看起来,在中钱从一个人那里跑另一个人那里去了,但是不会
凭空多出来或少掉。比如上面那个向你建议的人,他的期望就是
-1/6元,平均一次他会输掉这么多,所以他其实不该向你建议这次赌
博的。

  现在假设在向你建议以上的赌局的同时,此人还向你建议另一个
赌局:如果抛出2,你就赢2元,如果抛出4,你就输1元,其他情况大
家不赢不输。同样的算法,你会发现这种赌法对你也有利——你的期
望是2*1/6-1*1/6=1/6元。如果把上面的赌局和这个赌局同时玩(也
就是说只抛一次骰子,但是两个赌局都按这次抛骰子的结果来结算输
赢),那么结果如何呢?如果抛出1,那么按第一个赌局你赢3元,按
第二赌局大家不赢不输;如果抛出2,那么按第一个赌局你输1元,按
第二赌局你赢2元,总体说来你赢1元;同样地,总体说来,抛3,你
输2元,其他情况大家不赢不输。所以如果两局同时赌,你的期望是
3*1/6+1*1/6-2*1/6=1/3元。

  我们把这样多局同时赌的赌法称为“复式赌局”。比如说在现实
生活中你去买张复式彩票,甚至包局,这就是一种复式赌局。我们可
以证明,复式赌局的期望就是里面每个单局赌局的期望之和,比如上
面的复式赌局的期望就是1/6+1/6=1/3元。所以如果一个复式赌局里
每一局都对你有利,也就是期望都是正的,那么整个复式赌局的期望
当然也就是正的,对你有利,如果有人向你建议这么个赌局,就该毫
不犹豫地接受。这可以被称作“复式原则”。

一、Levin悖论

  可是且慢。数学家Leonid Levin在今年的《数学报道员》第23期
上提出了一个奇怪的悖论,似乎和“复式原则”相抵触,虽然每一个
的赌局对你都有利,可是如果你同时接受所有的赌局,你就一定会输!

  为了把他的例子说清楚,我们需要一点实数理论的知识(如果看
不懂这个例子,你可以看后面的例子,后面的例子比较容易看懂)。
考虑所有的实数。有些实数在十进制表示下小数部分的位数是有限的,
比如1.2568,-9.5555等(虽然上面的两个小数也可以写成无限小数
的形式,比如1.2568=1.2657999999……,但是我们规定如果循环节
为9,那么一律写成有限小数的样子,这样每个实数都只有唯一一种表
示),也有一些小数部分的位数是无限的,比如1/3表示成十进制小数
就是0.3333……,或者π=3.14159……。

  我们可以把实数分成一组一组的,两个实数在同一组,当且仅当
它们的差是有限小数。比方说,所有的有限小数自然都在同一个组里;
π、π+0.25、π-100也都在同一个组里(当然这个组里不止这么几个数)。
很显然,一个实数x只能在一个组里,如果它同时在两个组里,我们从
第一组里拿一个不在第二组里的a,又从第二组里拿一个不在第一组里
的b,那么因为x既在第一组里又在第二组里,所以x-a和x-b都该是有
限小数,但是这么一来(x-a)-(x-b)=b-a也该是有限小数,这就和a、
b不在同一组里矛盾了。

  于是我们就把所有的实数分成了互不相交的一些组(或者说集合),
每个实数都在而且仅在一个组里。事实上这样分好的组有无限多个。
现在我们从每个组里选一个组长。组长是谁无所谓,只要一个组只有
一个组长,而且组长是组里的成员就可以了。有个组长的好处是我可
以用组长来称呼这个组,比方说我可以说“π所在的那个组”。也不
一定非选π是组长,你完全可以选π+1.2356是组长,那么“π+1.2356
所在的那个组”和“π所在的那个组”其实是同一个组。但是要注意
的是,组长可以随便选,但是一旦组长选好了,就定下来不能变了,
一个组只能有一个组长。

  现在假设每个组都选好了组长,我们把所有组长的集合记为C,而
把所有有限小数组成的集合记为D(很容易知道,这其实就是一个组)。
现在任何一个实数x都可以写成c+d的形式,这里c是C中一个元素,d是
D中的元素。这样的表达方法是唯一的。事实上,任何一个实数x都属
于某一组,那么假设这个组的组长是c,x就可以写成c+(x-c),根据组
的定义,x-c属于D。

  现在我们可以来谈论赌局了。

  随机地选取一个0和1之间的实数(包括0,不包括1)。这个选法
可以是象幸运轮那样的赌法,只是现在不是一格一格地写着数字了,而
是轮周上的每一点都是一个不同的选择:拿一个周长为1的圆盘,上面
标好一个点算原点,正上方有个不动的指针指着圆周上的某一点。然后
让圆盘高速旋转,随机地让它停下来,然后测量原点顺时针方向到现在
指针所指的位置的距离,这个距离就是我们随机选取的实数。

  从上面的讨论我们知道,这个随机选取的实数可以被唯一地写成
c+d的形式,其中c是一个组长,而d是一个有限小数。现在我向你建议
我们打一个这样的赌:如果d是0.7,那么你赢2元,如果d是0.9,那么
你输1元,其他情况我们都不赢不输。

  这个赌自然对你有利,因为那个d是0.9还是0.7的可能性是一样的,
但是在一种情况下你只输1元,而另一种情况下你赢2元。事实上如果我
们用P(d,d')来表示这样的赌局(这里d和d'是两个不同的有限小数):
随机选取一个0和1之间的实数x,我们找到它所在的组,组长为c,那么
如果x是c+d,你赢2元,如果x是c+d',你输1元。上面我建议的赌局就
是P(0.7,0.9)。和上面同样的分析我们知道,无论是什么d和d',这个
赌局对你来说都是有利的。

  现在我来建议一个复式赌局,我们来赌所有这样的P(d,d')的赌局,
这里d'是把d的小数部分第一位去掉后的小数。比如说P(0.1234,0.234),
P(0.98521,0.8521),P(0.321,0.21)都是这个复式赌局里要考虑的赌
局。因为每个P(d,d')对你都是有利的,你自然会觉得这么一个复式赌
局对你也该有利——可是这完全错了。

  假设我们随机选取的实数可以写成c+0.321的样子,我们来看看你
到底会赢多少。你唯一赢的那个赌局是P(0.321,0.21),你赢了2元。
可是你输了P(0.0321,0.321),所以输了1元,可是不仅如此,你还输
了P(0.1321,0.321),P(0.2321,0.321),……P(0.9321,0.321)这
些赌局,所以一共输了10元。总体说来,你输了8元。糟糕的是,无论
随机选取的实数是什么,你都会这么每次输掉8元!

  这怎么可能呢?每个赌局都对你有利,可是要是同时赌这些赌局,
你却必输无疑!
作者:eigolomoh【异调】

你可能感兴趣的:(C++,c,算法,生活,C#)