【问题标题】:Script efficiency - Poker simulations for statistics脚本效率 - 用于统计的扑克模拟
【发布时间】:2019-04-16 10:57:30
【问题描述】:

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

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

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

首先,我比较玩家 A 可以得到的所有可能的手牌: [A1A2B1B2B3, A1A2B1B2B4, A1A2B1B2B5,...,A3A4B3B4B5] 并获得他最好的手牌(即每位玩家的 60 种组合)。

对所有玩家执行此操作,然后检查谁拥有获胜手牌。

我的问题是:您认为有没有一种方法可以让每个玩家的最佳手牌无需检查所有 60 种组合?

我花了 16 个小时来运行约 65 亿次迭代(约 250 万手 x 60 种板组合 x 每手 40 次迭代)。

您能否也谈谈效率?我不知道我是不是在尝试一些不可能在这里完成的事情=P

编辑 - 已解决

感谢您的意见,伙计们。最后我通过位操作解决了它:

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

【问题讨论】:

  • 您的部分问题应该发布在代码审查上。然后,根据您编写的内容,您的脚本运行了 65 亿次不同的迭代。您可以创建多个处理来一次处理多个迭代。最后,对于最有趣的逻辑部分,我很遗憾不知道这个游戏的规则,也不知道你如何定义哪一手牌最好。作为猜测,我想知道您是否可以为每张牌分配一个值并计算手牌的总和/分数。
  • 谢谢!我将搜索多重处理。听起来这就是我需要的。
  • 好吧,多处理只是并行计算多个迭代的欺骗。它会让事情变得更快,但逻辑/算法的改进会更好。

标签: java python poker


【解决方案1】:

取决于您的评估功能如何运作。如果你只有一个黑匣子,它可以接收 5 张牌并产生评估,那么除了将 60 个 5 张牌全部喂给它之外,你无能为力。但如果能拆成碎片,说不定可以绕过一部分。

例如,我在 onejoker 中的代码是遍历有向无环图的 5 步,因此我为 7 张卡片创建了一个特例函数,该函数跳过重复以相同卡片开头的组合的某些步骤。它最终仍会评估所有 21 个(7 选择 5)组合,但步骤少于 5 * 21。你可以为奥马哈牌做类似的事情。

【讨论】:

    【解决方案2】:

    我不会分成五手牌:

    • 使用 collections.Counter 在 9 张手牌上检查 4k、fh、3k、2p、p
    • 在地图上使用 collections.Counter(fget_suit, hand) 来检查 冲洗
    • 如果必须使用 Counter(x-y for x, y) 检查直线 in zip(hand[1:], hand))

    如果你真的想看看每个玩家最好的 5 张牌:

    • 转出最低的 4 张(如果有 4 张)未配对、未同花、未连接的牌。
    • 这不会解决所有问题,但会大大减少问题

    【讨论】:

      猜你喜欢
      • 2017-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-29
      • 1970-01-01
      • 2013-01-14
      • 2010-09-16
      相关资源
      最近更新 更多