我有这个问题:我想知道一个手持扑克牌组合的玩家击败另一个手持不同扑克牌组合的玩家的频率是多少。
投资组合中的每一只手都被赋予一个权重(即可能性)。投资组合中的每一只手都知道自己的“实力”。这实际上意味着所有的牌都已经发完了。所以请假设不再需要发牌了。
这个问题令人讨厌的原因是因为重复的卡问题。例如,如果我从每个玩家的投资组合中随机选择一个持有量,我必须检查这些持有量是否共用一张牌--很明显,两个牌局都不能发同一张牌。
我想快速地做这件事,这样我就可以每秒进行许多不同的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的概率
发布于 2010-11-11 03:23:42
我认为你想要这样的东西:
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作为Ac,HandB作为Ac的可能性不再是7.5% (实际上,这是0%的可能性)。所以你把A有一只手的概率乘以B有一只手的概率,给定A的手,乘以A的手击败B的手的概率。这应该会给出A用这只手对抗B的那只手并获胜的概率。我认为,迭代所有这样的对应该会得到想要的结果。
由于该方法是详尽的,因此不需要任何形式的蒙特卡洛模拟。当然,这将是O(n^2),其中n是可能的手的数量,但这里的n相对较小。
编辑:我应该注意到,由于您指的是所有牌都已发完的情况,因此getProbabilityADefeatsB()函数将返回1或0。另外,getConditionalProbability()要么恰好是0(因为两手共用一张牌),要么就是您的正常体重。如果手不那么具体,情况会更复杂(如果HandA是AA,那么HandB可能是AA的不同风格,但可能性较小)。
发布于 2010-11-11 00:33:37
我写了一些软件,通过蒙特卡洛实现了这一点。这意味着我用两只手跑了1000次,在给定情况下可能到达的随机棋盘,并计算了输赢。令人惊讶的是它是准确的。
因为我是为德克萨斯霍尔登做的,所以我会在(1)交易,(2)翻转,3(轮)之后做同样的事情,这样玩家就可以看到他们的百分比是如何变化的。
我真的应该完成那个软件。但是我不在网上玩扑克了.
发布于 2010-11-11 00:34:31
我认为Andrew Prock在这里被认为是专家;请查看讨论here,以及其中的链接。
https://stackoverflow.com/questions/4146640
复制相似问题