拿一副52张的扑克牌,切成两部分,然后将它们交错叠成一副(又称交错式洗牌法)。连续洗8次,会发生什么?答案是这样的:如果你使用最严格的洗牌法,那么洗8次正好可以让这副牌恢复成没洗之前的排列。如果洗牌时带有随机性,那么8次正好是能让你洗匀这副牌的次数。这个答案我以前就有所耳闻。出于好奇,我去搜索了这两个答案的证明法。
作为一个数学系毕业之后很久没碰正经数学的人,我被这两个证明法、尤其是后一个的精妙打动了。所以,这期TIL对于数学恐惧的读者们来说可能会很无聊。话说回来,即使对证明不感兴趣,这两个结论本身也是很有趣的豆知识。
问题一:洗多少次牌能洗回最初的排列呢?完美洗牌的要求是切牌时完全严格地切成每副26张的两部分(去掉大小王),然后将两部分完美交错地叠在一起。
根据先叠哪一部份分为内外两种:如果洗牌前头尾两张仍然在头尾,称为外完美洗牌法。如果头尾两张被洗到了第二张和倒数第二张,称为内完美洗牌法。对于“8次恢复”来说,专指8次外完美洗牌法。如果把原始的52张牌编号成:0 1 2 3 … 50 51这样的形式,那么洗完一次以后会变成0 26 1 27 … 25 51这样的排列。
这个变换有没有简单的描述法呢?是有的。
洗牌前0-25号牌的编号乘以2,就是洗牌后的位置。而26-51号洗牌后的位置,则需要乘以2之后减去51。换言之,如果用f(x)代表x号牌洗牌后的位置,那么f(x)=(2*x)%51。用公式表示以后洗两次牌以后x的公式也可以算出来了:f(f(x))=(4*x)%51。以此类推,洗8次牌就会变成f(f(f(f(f(f(f(f(x))))))))=(256*x) %51。
由于256除以51的余数正好是1,所以上面这个式子正好等于x。换言之,洗8次牌之后,x号牌还是在x号的位置,回到了起点。
问题二:洗多少次牌能洗匀呢?这其实取决于我们对“洗牌法”的描述和对“洗匀”的定义。洗牌虽然是个直观的过程,精确定义却很难。对洗牌比较准确的描述是1955年提出的Gilbert-Shannon-Reeds模型。定义完了洗牌,我们来考虑“洗匀”。
52张牌洗完以后共有52!这么多排列方式。如果每种排列的出现概率都是1/52!,那么肯定是洗匀了,但是实际上肯定会有误差。误差越小,“洗匀程度”越高。数学上常用的一种描述两个概率分布之间差距的方式叫全变差,就是把对应的每个事件的概率差绝对值加起来除以2,得到的结果越小,说明概率分布越接近。如果完全没洗,那么全变差会非常接近1。
不过,如果你不喜欢全变差,想用另外一种方法计算误差的话也没关系,因为洗完后出现某种排列的概率是可以精确算出来的。
由这里开始,就可以在n=52的情况下计算洗牌次数不同的时候全变差是多少了。洗5次以下的时候全变差接近1,而洗6,7,8次牌时全变差分别是0.614, 0.334和0.167。洗8次牌就可以认为是洗匀了。当n趋近于无穷的时候,需要的洗牌次数接近1.5*log_2(n)。