我有一张部分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;
种可能性循环的方式做到这一点?
我假设有一种方法可以用组合学方法做到这一点,但我不知道如何处理依赖的可能性,因为剩余的卡数可能会改变,而且有些卡是可能已经修复。
答案 0 :(得分:1)
如果空白随机填充卡片,我想得到每个可能结果的数量(高卡,一对,两对,等等)。
如何以不需要
<remaining>! / <remaining - blank spaces>
种可能性循环的方式执行此操作?
大多数此类卡片计数器的工作方式是随机填充空白,因为您具有计算能力和耐心。正如你所说,有大约3.12亿个实际选项,但你可能会随机抽取大约3000万个并进行推断。
或者,如果您真的想要确切的数字,我能想到的减少计算的唯一方法是:
能够确定空白何时不能进一步影响手部 类型。对于5张牌而言,这是最小的,但如果你是 从Hold&#39;中获得7张牌中最好的5张牌,这可以 很好地利用了。
使用剩余卡增加值的概率 手。例如,[4h,4c,4d,2s,&lt; blank&gt;]是唯一的牌 有所作为的是4s,2h,2d,2c。任何其他卡都在运行 无论如何都要给你3个,所以你真的不需要 此时迭代所有选项。这与第1点非常相似,只是更进了一步。