【发布时间】:2016-01-19 00:28:54
【问题描述】:
我有部分 5 张牌。请注意,顺序很重要,空格可能在任何地方。 (例如,我可以有10H <blank> <blank> KH <blank>)
我还知道剩余的牌(即(标准 52 张牌)套牌的某个子集,减去部分手牌中的牌)。 (总有足够的牌来填手)
如果空白处随机填充卡片,我想计算每个可能结果(高牌、一对、两对……等)的计数。
简单的算法(循环所有可能的方法来填充剩余卡片中的空白,增加填充手的计数)有效,但是太慢了(最坏的情况是52! / (52-5)! ~= 312 million case )。
如果每个案例都是独立的,那就“容易”了。不幸的是,他们不是,结果系统有点像这样:
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;
那么,我该如何以不需要循环 <remaining>! / <remaining - blank spaces> 可能性的方式做到这一点?
我假设有一种方法可以使用组合学来做到这一点,但我不知道如何处理相关的可能性,因为剩余的卡片数量可能会改变,而一些卡片可能是固定的。
【问题讨论】:
-
这是一个统计/概率问题,还是更多的编程问题?
-
我本来打算在 stackoverflow 上发布它,但他们的
statistics标签说要考虑在这里发布您的问题,这是一个算法问题,而不是真正的编程问题。 -
顺序到底有多重要?这与扑克牌的价值无关。您需要准确的计数还是可以接受近似值?即使顺序很重要,在您的示例中最多有 50*49*48 =117600 种可能的方法来填充这些空白(在最坏的情况下最多 5997600 种已经显示了一张卡片:没有显示卡片的情况很长已经制定出来,几乎可以在任何扑克网站或书籍上找到)。这个数字非常小。
-
这是一个变体,它们必须在其中才能运行。精确的。而且我正在做很多这样的事情(阅读,〜数百万)所以每次运行 600 万个组合有点荒谬。
标签: combinatorics