部分5张牌扑克手评估

时间:2016-01-09 20:02:33

标签: combinatorics

我有一张部分5张牌的扑克牌。请注意,订单很重要,空白可能在任何地方。 (例如,我可以10H <blank> <blank> KH <blank>

我也知道剩下的牌(即(标准52张牌)牌组的某些子集,减去部分牌中的牌)。 (总有足够的牌可以填补手牌)

如果空白随机填充卡片,我想得到每个可能结果的数量(高卡,一对,两对,等等)。

天真的算法(循环所有可能的方法来填充剩余的卡片中的空白空间,递增填充的手所用的任何数量的计数)起作用,但是太慢了(最坏的情况是{{1} }例)。

如果每个案例都是独立的,那么它就很容易&#34;。不幸的是,它们不是,结果系统有点像这样:

52! / (52-5)! ~= 312 million

那么,我如何以不需要if (hasFlush) { if (hasRoyal) return PokerHand.ROYAL_FLUSH; if (hasStraight) return PokerHand.STRAIGHT_FLUSH; } if (maxOfAKind == 4) return PokerHand.FOUR_OF_A_KIND; if (rankCountCounts[3] == 1 && rankCountCounts[2] == 1) return PokerHand.FULL_HOUSE; if (hasFlush) return PokerHand.FLUSH; if (hasStraight) return PokerHand.STRAIGHT; if (maxOfAKind == 3) return PokerHand.THREE_OF_A_KIND; if (rankCountCounts[2] == 2) return PokerHand.TWO_PAIR; if (rankCountCounts[2] == 1) return PokerHand.ONE_PAIR; return PokerHand.HIGH_CARD; 种可能性循环的方式做到这一点?

我假设有一种方法可以用组合学方法做到这一点,但我不知道如何处理依赖的可能性,因为剩余的卡数可能会改变,而且有些卡是可能已经修复。

1 个答案:

答案 0 :(得分:1)

  

如果空白随机填充卡片,我想得到每个可能结果的数量(高卡,一对,两对,等等)。

     

如何以不需要<remaining>! / <remaining - blank spaces>种可能性循环的方式执行此操作?

大多数此类卡片计数器的工作方式是随机填充空白,因为您具有计算能力和耐心。正如你所说,有大约3.12亿个实际选项,但你可能会随机抽取大约3000万个并进行推断。

或者,如果您真的想要确切的数字,我能想到的减少计算的唯一方法是:

  1. 能够确定空白何时不能进一步影响手部 类型。对于5张牌而言,这是最小的,但如果你是 从Hold&#39;中获得7张牌中最好的5张牌,这可以 很好地利用了。

  2. 使用剩余卡增加值的概率 手。例如,[4h,4c,4d,2s,&lt; blank&gt;]是唯一的牌 有所作为的是4s,2h,2d,2c。任何其他卡都在运行 无论如何都要给你3个,所以你真的不需要 此时迭代所有选项。这与第1点非常相似,只是更进了一步。