脚本效率 - 统计数据的扑克模拟

问题描述 投票:0回答:2

我的问题更多的是逻辑而不是编码本身:我正在构建一个python脚本来模拟扑克手并从中获取统计数据。我的代码非常适合分配和比较指针,我的脚本唯一的瓶颈就是为每个玩家获得最佳的卡片组合:模拟是为了奥马哈 - 每个玩家获得4张牌,棋盘有5张牌。每位玩家必须使用5张牌的最佳组合(2张来自玩家手牌,3张来自棋盘牌)。

问题是:到目前为止,我能想到的唯一方法是比较一名球员可以拥有的每一手牌,然后与其他球员进行比较。

例如,玩家A有牌A1A2A3A4,牌子是B1B2B3B4B5:

首先,我将比较所有可能的牌手A:[A1A2B1B2B3,A1A2B1B2B4,A1A2B1B2B5,...,A3A4B3B4B5]并得到他最好的牌(每个牌手的60个组合)。

为所有玩家执行此操作,然后检查谁拥有获胜者。

我的问题是:你认为有一种方法可以让每个球员的最佳牌不必检查所有60种组合吗?

我花了16个小时来完成~65亿次迭代(约250万手×60个板组合×每手40次迭代)。

您是否也可以权衡效率?我不知道我是否正在尝试在这里无法完成的事情= P.

编辑 - 已解决

伙计们,感谢您的投入。最后我通过使用位操作解决了它:

https://codereview.stackexchange.com/questions/217597/forming-the-best-possible-poker-hand?noredirect=1#comment421020_217597

java python poker
2个回答
1
投票

取决于您的评估功能如何工作。如果你只有一个带有5张牌的黑匣子并进行评估,那么除了全部60张5张牌之外,你所能做的并不多。但如果它可以分解成碎片,那么可能会绕过它们中的一些。

例如,我在onejoker中的代码是通过有向无环图的5步走,所以我为7张卡制作了一个特殊情况函数,跳过重复一些以相同卡片开头的组合的步骤。它最终还是会评估所有21种(7种选择5种)组合,但步数不到5 * 21。你可以为奥马哈手做类似的事。


0
投票

我不会分成5个硬手:

  • 使用9张牌上的collections.Counter来检查4k,fh,3k,2p,p
  • 在地图上使用collections.Counter(fget_suit,hand)来检查是否有刷新
  • 如果你需要使用计数器检查直道(x-y表示x,y表示拉链(手[1:],手))

如果你真的想看到每个球员最好的5张牌:

  • 转储最低4(如果有4个)未配对,不适合,未连接的卡。
  • 这不会解决所有问题,但会大大减少问题
© www.soinside.com 2019 - 2024. All rights reserved.