【问题标题】:Partial 5-card poker hand evaluation部分 5 张牌扑克手评估
【发布时间】: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


【解决方案1】:

如果空白处随机填充卡片,我想计算每个可能结果(高牌、一对、两对……等)的计数。

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

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

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

  1. 能够确定空白何时不能进一步影响手 类型。对于一手 5 张牌来说,这是最小的,但如果你是 从 7 张牌中取出最好的 5 张牌,就像在德州扑克中一样,这可以 被充分利用。

  2. 使用剩余卡片增加价值的概率 手。例如,只有 [4h, 4c, 4d, 2s, ] 有所不同的是4s,2h,2d,2c。任何其他卡都可以 给你 3-of-a-kind 无论如何,所以你真的不需要 此时遍历所有选项。这点真的和第1点一样,只是更进了一步。

【讨论】:

  • 不幸的是,扑克牌就是扑克牌,这严重低于或过度代表某些牌。例如,如果你有一副牌减去了四张 A 中的三张,你就可以通过一种方式获得皇家同花顺。但是这种方法将在 0 和 10 (!) 种可能性之间交替。我想知道我是否可以使用蒙特卡洛和“列举所有得分可能性并计算从牌组中抽出所述手牌的方法数量”之间的混合体来处理稀有手牌。嗯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 1970-01-01
  • 2017-07-11
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多