beautyofcomm

效益解码(也叫超音速)扑克游戏的概率问题(续)

0
阅读(3161)

上一篇博文提到了用暴力搜索来遍历组合

接下来就来说说优化算法。

对于一个特定的组合,其排列次数只和最小值有关,那么我们是不用遍历所有组合的,只需要计算出最小值为2,3,……的组合的次数,再计算出对应的排列次数,两者相乘,就可以得到取出固定个数的排列次数了。

以翻16次(即从2到13选3张牌插入已经排好顺序的13张牌中)为例,其所有组合的最小值以及该最小值对应的组合的个数分别为下表所示

image

…………

对于其它次数的和其类似,这里不再赘述。由于不用遍历组合,所以优化算法的代码中少了getNewCombination函数,但是会多一个求排列A(n,k)的函数getPermsCnt。因此主函数也改动较大。其它部分都大体相似。代码在微盘,名叫Poker_Method2.cpp:http://vdisk.weibo.com/s/znazA6MWCDNMb

已经验证过,优化算法的结果和上篇文章的暴力算法一模一样,如下图。速度方面,对于翻13张牌,两者的运行时间差异不大,但如果把这个数目加大,就可以看出优化算法的效果了。比如翻26张牌(只须将代码中的宏定义FLIP_CNT改为26就行了),暴力算法要跑几分钟,而优化算法仍然是1秒内出结果。

image

问题发散

我们已经求出了在限定时间(因为每个人来回的时间可以设为一个固定的常数,即等同于限制了翻牌的次数)内,团队有多大的概率能够翻开所有牌。那么,假设翻开一张牌得10分,那么团队在同样的限定时间内能够得分的期望是多少呢?

好吧,我问题太多了,受不了了~过段时间再写个续2吧~囧