如何循环遍历所有组合,例如48 选择 5 [重复]

2024-06-20

可能的重复:
如何在java中从大小为n的集合中迭代生成k个元素子集? https://stackoverflow.com/questions/4504974/how-to-iteratively-generate-k-elements-subsets-from-a-set-of-size-n-in-java

我想构建自己的扑克牌评估器,但在特定部分遇到问题。

如果两名玩家拿到两张牌,则牌堆中还剩下 48 张牌。在德州扑克中,随后会再发 5 张可能的公共牌(称为牌面)。我想枚举/循环所有 48 个选择 5 种可能的棋盘组合,并计算玩家 A 获胜的次数和玩家 B 获胜的次数以及他们平局的时间。

我不知道如何系统地循环遍历每 5 张卡片组合。有人有什么想法吗?这些卡片表示为 Card 类的数组,但我也可以将它们表示为位集(如果这样可以加快速度)。

我正在用 Java 做这个。

非常感谢


(免责声明:我写了一个非常快速的扑克牌评估器)

我想枚举/循环所有 48 个,选择 5 个可能的 棋盘组合并计算玩家 A 获胜的次数和次数 玩家 B 获胜,当双方平局时。

您不想每次在翻牌前两个玩家之间进行对决时都评估 C(48,5) (1 712 304) 手牌:大多数程序只是在翻牌前两个玩家之间的所有可能对决之间使用预先计算的查找表。

例如,假设您有“Ac Ad”与“7c 6c”,您只需查看包含以下内容的查找表:1 333 573, 371 831, 6900(其中 1 333 573 是“Ac Ad”获胜的次数,371 831 是“7c 6c”获胜的次数,6 900 是平局的次数(它们的总和为 1 712 304)。要获得一些空间,您可以可以丢弃 6 900,因为知道平局数始终为C(48,5) - (胜 1 + 胜 2).

(更多关于本答案末尾的查找表)

但回答你的问题:

我不知道如何系统地循环浏览每 5 张卡片 组合。

如果您确实想循环遍历每个组合,您必须知道扑克牌评估器通常是那种需要非常非常快的程序。这些程序通常可以每秒评估数亿次手(您没看错:数亿次)。

当您需要如此高性能的“数字运算”时,您可以忘记“设计模式”和“面向对象”。你想要的是原始速度。

例如,下面的代码将通过最内层循环 C(48,5) 次,而且速度相当快:

    for ( int i = 0; i < n; i++ ) {
        for ( int j = i + 1; j < n; j++ ) {
            for ( int k = j + 1; k < n; k++ ) {
                for (int l = k + 1; l < n; l++) {
                    for (int m = l + 1; m < n; m++) {
                        ...
                    }
                }
            }
        }
    }

对于翻牌前的两名玩家来说,这可能是一个非常糟糕的主意:使用查找表你会更快。

但是对于翻牌前的三名玩家(使用翻前牌桌是不切实际的,有太多的对局),您可能想要像这样循环,在 C(46,5) 手牌上,使用五个嵌套循环(当然您需要使用 i,j,k,l,m 从剩下的 46 张牌中取出正确的 5 张牌)。然后,一旦你拿到了 5 张牌,你就可以使用快速手牌评估器,为你提供 7 张牌中最好的一张(牌面的 5 张牌 + 每个玩家的两张牌)。

关于查找表:

大多数人使用近似的 169 vs 169 查找表(“Ac Kd”、“As Kh”、“Ad Ks”等全部变成“AK 非同花”,并且 C(52,2) 可能的起手牌被分组为 169 类型起手牌数)。维基百科文章解释了如何获得 169 张非等值起手牌:

http://en.wikipedia.org/wiki/Texas_hold_%27em_starting_hands http://en.wikipedia.org/wiki/Texas_hold_%27em_starting_hands

当你采取时它们是不等价的one手考虑,但一旦你这样做手牌 1 VS 手牌 2“169 vs 169”是一个近似值(这是一个很好的近似值)。

当然,你可以变得更喜欢。只有 C(52,2)(给出 1326)种真正不同的德州扑克起手牌,这意味着在现代计算机上构建完美的查找表(根本没有近似值)非常实用(C(1326,2) ain没那么大)如果你真的需要完美的数字。如果您可以接受近似值,请使用 169 与 169 表(它需要 C(169,2) 或 14 196 个条目)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何循环遍历所有组合,例如48 选择 5 [重复] 的相关文章

随机推荐

  • 对于编写有意义的基准,您能给我什么建议?

    我开发了一个框架 供我们组织中的多个团队使用 在此框架之上开发的这些 模块 的行为可能截然不同 但它们都非常消耗资源 尽管有些模块比其他模块消耗的资源更多 它们都接收输入数据 分析和 或转换数据 然后进一步发送 我们计划购买新硬件 我的老板
  • iPhone - UIImage imageWithData 返回 nil

    我需要从字节数组创建 UIImage 现在我创建了字节数组 image CGImageCreateWithImageInRect aux CGImage imageRect context CGBitmapContextCreate dat
  • Scala sbt 项目给出 NullPointerException?

    当我运行命令时sbt clean compile run在我的 sbt 项目中 它给出了空指针异常 这是控制台输出 info Loading project definition from home dnilesh workspace wi
  • 使用chart.js 的年龄金字塔图

    我正在尝试使用 Chart js 创建一个图表 如下所示 例如 https thebreadoflifeblog files wordpress com 2013 01 uk age pyramid png https thebreadof
  • 我无法使用 scikeras.wrappers.KerasRegressor 执行 cross_val_score

    from tensorflow import keras from sklearn model selection import cross val score from sklearn datasets import make regre
  • 将MongoDb atlas数据库导出到本机Mongo compass

    我在 Atlas 中有一个名为 test 的远程数据库 我想将集合名称 image table 下载为 JSON 文件 在 Mac 终端中 mongoexport db test collection image table image j
  • 通过 WSAPI 在服务器端计数?

    是否可以使用 WSAPI 在 Rally 的服务器端进行对象计数 例如 我有一个应用程序想要计算工作区中每个项目的未解决缺陷数量 我不需要了解这些缺陷本身的任何信息 所以我只想要一个计数 不需要撤回任何其他数据 有办法做到这一点吗 您可能想
  • 从 C# 调用接受调用者分配的结构数组的 C 函数

    我有以下 C 结构 struct XYZ void a char fn MAX FN unsigned long l unsigned long o 我想从 C 调用以下函数 extern C int func int handle int
  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • mysql自动存储记录创建时间戳

    mysql 有什么方法可以在创建记录时自动将时间戳存储在记录行中 我试图使用时间戳 数据类型 和 current timestamp 作为默认值 但后来意识到每次更新记录时都会更新 我只需要一些可以存储创建时间戳的东西 Thanks Set
  • JSF - 在 ajax 调用上传递参数 - 这段代码有什么问题?

    当我进行 ajax 调用时 我需要将参数传递给 bean 我的豆子是这样的 ManagedBean RequestScoped public class Selector ManagedProperty value param page p
  • CSS 中的像素与像素密度

    我对 HTML 和 CSS 非常陌生 我突然想到 当决定某个东西是 5px 时 比如说 由于像素的物理尺寸取决于密度 所以 5px 在 100 ppi 的屏幕上看起来肯定比在 300 ppi 的屏幕上看起来更大ppi 这是正确的吗 如果是
  • Android应用程序组件销毁和重新创建的详细信息

    有人可以向我提供一些具体的 值得信赖的 最好是简洁的 信息 内容如下 系统销毁和 如果适用 重新创建组件的顺序 片段 活动 活动的线程 异步任务 计时器 静态数据 类何时卸载 其他类中的线程 异步任务 定时器 主机 TabActivity
  • Jenkins Slave 自我注册

    我正在创建一个 Jenkins 主 从集群 但我无法找到一种方法让新的从服务器自动向主服务器注册 我当前的设置是运行一些 Terraform 脚本来创建主服务器和 5 个从服务器 然后我必须登录主节点并管理 Jenkins gt 管理节点
  • xamarin 表单中标签的数据绑定部分

    我在 Xamarin 表单中使用 Label 我必须显示一个文本 它基本上是一个句子 但该字符串的一部分包含我从 api 调用获得的数字 而字符串的其余部分是固定的 我想使用数据绑定来设置该部分 例子 文字可以是这样的 您肯定可以赢得 0
  • Objective-C NSString for 循环与characterAtIndex

    我试图逐个字符地循环遍历 NSString 但出现 EXC BAD ACCESS 错误 您知道如何正确执行此操作吗 我已经在谷歌上搜索了几个小时但无法弄清楚 这是我的代码 m self textLength self text length
  • 解析时区并转换为夏令时

    我有一个 pandas 数据框Datetime column Datetime 0 2019 01 01 17 02 00 1 2019 01 01 17 03 00 2 2019 01 01 17 04 00 3 2019 01 01 1
  • 垂直对齐复选框标签? [复制]

    这个问题在这里已经有答案了 我有这样的复选框
  • 在html表格的每一行添加点击功能

    我最近创建了一个函数 它根据用户在网站中的输入进行一些复杂的名称匹配 并将结果作为表格格式的 html 文件返回 我的问题是如何在每一行添加点击功能 df get cust info returns a pandas dataframe d
  • 如何循环遍历所有组合,例如48 选择 5 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在java中从大小为n的集合中迭代生成k个元素子集 https stackoverflow com questions 4504974 how to iteratively generate k