1

我有这个问题:我想知道持有扑克牌组合的玩家击败另一个持有不同扑克牌组合的玩家的频率。

投资组合中的每一手牌都有一个权重(即可能性)。投资组合中的每一手牌都知道自己的“实力”。这实际上意味着所有牌都已发牌。所以请假设不再需要发牌。

这个问题很烦人的原因是重复卡问题。例如,如果我从每个玩家的投资组合中随机选择一个持牌,我必须检查这些持牌是否不共用一张牌——显然这两种牌不能发同一张牌。

我想快速做到这一点,以便每秒可以进行许多不同的 RangeA 与 RangeB 比较。我有一个解决方案,但我不会谈论它,因为我不想污染任何回应。

-- 举个例子 --
给定一张 5 张牌的“Ah 3c 8c Td Jh”:
HandRangeA = {{"As Ac", 2.5%}, {"As Ad", 2.5%}, {"Ac Kc", 5%}....}
HandRangeB = {{"As Ac", 7.5%}, {"As Ad", 7.5%}, {"Ac Kc", 5%}....}
(每个 HandRange 包含所有不使用“董事会卡”的可能持有)

目标 :: 计算 HandRangeA 击败 HandRangeB 的概率

4

3 回答 3

1

我写了一些软件,通​​过 monte carlo 做到了这一点。这意味着我用双手完成了 1000 次随机板,根据情况可能会到达,并计算输赢。它出乎意料地准确。

因为我是为德州扑克做的,所以我会在 (1) 发牌、(2) 翻牌、3 (转牌) 之后做同样的事情,这样玩家就可以看到他们的百分比在给定牌面的情况下是如何变化的。

我真的应该完成那个软件。但是我不再玩在线扑克了....

于 2010-11-10T16:33:36.630 回答
1

我认为 Andrew Prock 被认为是这里的专家。查看此处的讨论以及其中的链接。

于 2010-11-10T16:34:30.973 回答
0

我想你想要这样的东西:

probWin = 0
For Each HandA in RangeA
  probA = getProbability(HandA)
  For Each HandB in RangeB
    probB = getConditionalProbability(HandB, HandA)
    probWin += probA * probB * getProbabilityADefeatsB(HandA, HandB)

您需要考虑条件概率,因为给定 HandA 为 As Ac,HandB 不再有 7.5% 的可能性为 As Ac(事实上,这种可能性为 0%)。因此,在给定 A 的情况下,您将 A 拥有特定手的概率乘以 B 拥有特定手的概率,再乘以 A 的手击败 B 的手的概率。这应该给你 A 用那手牌对抗 B 的那手牌并获胜的概率。迭代所有这些对应该会给出我认为的预期结果。

由于该方法是详尽无遗的,因此不需要任何类型的蒙特卡罗模拟。当然,这将是 O(n^2),其中 n 是可能的手数,但这里的 n 相对较小。

编辑:我应该注意,由于您指的是所有牌都已发牌的情况,因此 getProbabilityADefeatsB() 函数将返回 1 或 0。此外, getConditionalProbability() 将恰好为 0(因为双手共用一张牌)或者只是你的正常体重。如果手牌不太具体(如果 HandA 是 AA,那么 HandB 可能是 AA 的不同风格,但可能性较小),情况会更加复杂。

于 2010-11-10T19:23:41.760 回答