PLO-5 5张奥马哈中两个玩家手牌的胜率计算

一 今天无意之中看到两篇关于德州扑克计算玩家之间胜率的资讯

1.1 https://viegg.com/texas/cn.html

这个网址,是一个计算德州扑克玩家之间胜率的工具

每次选择两张手牌,点击「手牌」按钮选定,可以添加二至多名玩家。然后选择 0~4 张公共牌。选完后点击计算按钮计算胜率。由于性能问题不能穷举时,电脑会最多选出 10000 种情况,然后根据结果算出胜率,计算结果与真实胜率存在约 1% 以内的误差。点击计算后大概几秒钟后会算出结果,请耐心等候。
1.2 一个感兴趣的尝试,计算德州扑克胜率

https://www.cnblogs.com/wengshuhang/p/12510803.html

这个网址,是关于德州扑克胜率算法的

二 下面的github地址,是个人使用Go语言开发的,计算各种牌类游戏[Blackjack,Baccarat,Texas holdem,Pot Limited Omaha-4,Pot Limited Omaha-5]胜率的项目,代码开源。

https://github.com/poker-x-studio/poker_odds

三 关于PLO-5计算胜率任务的代码中,今天有修改一个bug。所以,也分享一下,poker_odds 项目中关于两个玩家之间胜率的算法。

1 确认两个玩家手上的有5张牌[一共10张牌]
2 洗牌,分别删除掉两个玩家手中的5张牌,剩下的42张牌为底牌
3 选择前面的5张作为公共牌
4 玩家1手里的5张牌和5张公共牌组合,选择一个最佳牌型1[玩家手里拿2张,公共牌拿3张,组合后最大的5张牌型]
5 玩家2手里的5张牌和5张公共牌组合,选择一个最佳牌型2
6 比较最佳牌型1和最佳牌型2,算一次计算结果[可能的结果包含胜,平,负],保存下来
7 从流程1开始到流程6,重复1w次,最后得到每次比牌的结果列表,计算总的胜利次数,比率

代码中有这样一个结构体

// 相同值
type sameValue struct {
    single_cnt int //单牌个数
    pair_cnt   int //对子个数
    three_cnt  int //三条个数
    four_cnt   int //四条个数
}

// AnalyseItem 分析项
type AnalyseItem struct {
    cards         []byte           //牌
    suit_cnts     []int            //花色统计
    value_cnts    []int            //牌值统计
    same_value    sameValue        //相同值
    Card_types    []CARD_TYPE.TYPE //牌型
    compare_cards []byte           //比较牌
    weight        int              //权重,用于比较牌大小,任何一副牌都有一个权重
}

每一手5张的牌型,都使用这个 分析项 分析解构,比如 包含了多少种花色,多少种值,相同值,解构之后的比较牌[比较牌是专门为A出现的情况而设置的,当A出现在顺子Straight中,会有两种不同的情况,A最小或最大]情况。

比如,

  • 当需要知道这一手牌是否是三条牌型[Three of kind]的时候,只需要查看 same_value.three_cnt 是否是1,same_value.single_cnt是否是2
  • 当需要知道这一手牌是否是同花[Flush]牌型的时候,只需要查看 suit_cnts 是否只有一种花色

四 实际运行结果和对比

用于对比的网站地址:https://beastsofpoker.com/poker-odds-calculator/

这个在线工具可以计算德州扑克,奥马哈等牌类游戏的手牌之间的胜率
  • 运行环境:vscode/windows
  • 运行条件:
  • 开启10个goroutine,每个goroutine循环1000次,也就是一共运行1万次[选择1万次的原因是计算时间刚好1秒,如果想要更加精确,可以加大循环次数]
    每循环1次就是,牌靴中有1副牌[去掉大小鬼,每副牌52张]

    同样的手牌,计算的结果存在一定的误差。
项目 Win Lose Tie
https://beastsofpoker.com/poker-odds-calculator/ 59.82% 40.17% 0.01%
https://github.com/poker-x-studio/poker_odds 58.62% 41.10% 0.28%

--the end