电脑中有一款比较简单的游戏:蜘蛛扑克。难度也可以从一种花色、两种花色、到四种花色。
这个游戏的核心技巧,就是堆栈(stack)技术,对于计算机软件专业的人员来说,这其实是一项基本技术。所以,我如果有时玩这个游戏的话,总是选择四种颜色的难度,取得若干连胜也是比较常见的。
这个游戏有个规则,就是有空位时,是不许发牌的。我现在的问题是,如果上面的扑克数量不足十张的时候,怎么办?会出现这样的问题吗?
要出现这个上面说的问题,就必须满足,最后一组没有发出的牌,必须是同一种花色且不能重复。(事实上,最后剩下两组时,保证花色不超过两种,且分组之后不重复;最后剩下三组时,保证花色不超过三种,且分组之后不重复。都是可能出现问题的。这里不讨论这部分。)
这样的概率是多大呢?
对于四种颜色,概率为 4C(13,10)/C(52,10),概率大致是亿分之7。
对于二种颜色,概率增大了512倍,大致是十万分之3.7。
对于一种颜色,概率再增大了512倍,大致是百分之1.9。
也就是说,出现最后十张没有发出来的扑克是完全不重复的,在选择一种颜色的难度时,概率还比较大。为了找到这样的现象,就反复发扑克,并检验最后的十张扑克,大约数十次之后,就出现了期望的结果。
这个结果有什么用呢?会出错!
我们不妨假定,这个程序非常的优秀,并且经过千锤百炼的检验,但事实上它还是会出现错误。这种不易被发现的错误,就是程序员的苦恼,就是你很难保证程序完全正确。这或许算作一个实例。
图一:最后十张扑克出现完全不重复的情况。
图二:游戏进行中。由于程序的错误,导致无法继续了。解决的办法,要么允许上面的扑克,不足十张时,有空位可以发牌;要么不允许“最后一组十张扑克是一套花色且不重复”。