下载APP
摆正心态,健康游戏 德州扑克洗牌算法浅谈
1970-01-01 08:33:34
长期以来德州扑克游戏的洗牌算法遭受玩家的指责与质疑,总有玩家怀疑系统洗牌算法不够公正和纯粹。那怎么样的洗牌才算公平公正呢,下面针对德州扑克游戏的洗牌算法做一次全面的分析和比较。
衡量标准
误差率
参考了知名博主陈皓的一篇博文:《如何测试洗牌程序》原文链接:http://coolshell.cn/articles/8593.html/comment-page-3#comment-1472633
有兴趣的可以去看一下。
我们知道,洗牌洗得好不好,主要是看是不是够随机。那么如何测试随机性呢?试想,我们有个随机函数rand()返回1到10中的一个数,如果够随机的话,每个数返回的概率都应该是一样的,也就是说每个数都应该有10分之1的概率会被返回。
一到概率问题,我们只有一个方法来做测试,那就是用统计的方式。也就是说,你调用rand()函数100次,其中,每个数出现的次数大约都在10次左右。(注意:我用了左右,这说明概率并不是很准确的)不应该有一个数出现了15次以上,另一个在5次以下,要是这样的话,这个函数就是错的。举一反三,测试洗牌程序也一样,需要通过概率的方式来做统计,是不是每张牌出现在第一个位置的次数都是差不多的。
这里提出了一个概念:误差率,即每张牌在1-52的位置上出现的概率和理论上的概率的偏差。
重复率
以上的测试只是测试了牌在各个位置的概率。这个还不足够好。因为还可能会现在有Patten的情况。如:每次洗牌出来的都是一个循环顺序数组。这完全可以满足我上面的测试条件。但是那明显是错的。所以,还需要统计每种排列的出现的次数,看看是不是均匀。
第二个概念的提出:重复率,即测试100w或1000w手牌,统计出现的某个相同序列的和占总样本的比例。
二、误差率横向比较结果
由表1可以看出,双手洗+切 算法在误差率统计方面表现最好,在100w的样本下误差率能缩小到2%以内,即洗牌相对比较均匀,但是这个数值只考虑了单张牌的概率,没有顾及一个序列或某个Patten的重复出现情况。这在实际项目中应用是远远不够的,实际中需要考虑的情况应该更多。
下一节将对重复率做一个横向的比较。
三、重复率横向比较结果
用Debao洗牌算法进行1000w手牌测试,结果重复率为0,但双手洗+切 算法只测试了10w手牌就出现了严重的重复现象,说明这种算法非常不合理。
由于Debao的洗牌算法是基于Fisher_Yates算法的,这也从侧面反映了经典Fish_Yates算法有其存在的道理。
通过这次测试,我们可以说能够做到1000w手牌不重复。其实这也不是什么难事,因为52张牌的随机组合有52的阶乘那么多种可能,计算了一下大概是,1000w和这个数比简直微不足道。
四、德堡扑克洗牌算法
随机执行1~3次Fisher_Yates算法
表3是在不同随机值情况下测试的Debao洗牌算法的误差率,从表中数据可以看出调整随机值对误差率的影响不是很明显。说明这个Fisher_Yates算法是比较稳定的。
五、结论
现有洗牌算法从概率角度来讲是绰绰有余满足游戏公平性需求的。至于经常有玩家质疑系统洗牌算法的现象,绝大多数是心理作用导致。请摆正心态,健康游戏!
(文:坤哥)