【问题标题】:Calculate Poker Hand Odds计算扑克手赔率
【发布时间】:2015-10-07 22:24:02
【问题描述】:

我正在使用这里找到的 this hand evaluator for nodejs:

https://github.com/chenosaurus/poker-evaluator

它工作得很好,而且在评估手牌方面非常快。但是,我想用它来编写一个脚本来计算赢得对手的一手牌的几率。

例如,两个玩家有两只手:[Ac, 8c] Vs [9d,9h] 等等。

我尝试循环遍历所有可能的板卡,例如:

var cards = [
    "2c","3c","4c","5c","6c","7c","8c","9c","Tc","Jc","Qc","Kc","Ac",
    "2d","3d","4d","5d","6d","7d","8d","9d","Td","Jd","Qd","Kd","Ad",
    "2h","3h","4h","5h","6h","7h","8h","9h","Th","Jh","Qh","Kh","Ah",
    "2s","3s","4s","5s","6s","7s","8s","9s","Ts","Js","Qs","Ks","As",
];

var hand = ["As", "Ks"];
var trials = 0;
for(i=0;i<cards.length;i++) {
    for(j=i+1;j<cards.length;j++) {
        for(k=j+1;k<cards.length;k++) {
            for(l=k+1;l<cards.length;l++) {
                for(m=l+1;m<cards.length;m++) {             
                    trials++;
                    var nh = hand.slice();
                    nh.push(cards[i]);
                    nh.push(cards[j]);
                    nh.push(cards[k]);
                    nh.push(cards[l]);
                    nh.push(cards[m]);

                    PokerEvaluator.evalHand(nh);
                }
            }
        }
    }
}

显然这还没有完成(它不检查手牌的等级或比较它),但这是我知道评估两只手所有可能的棋盘组合的唯一方法。

尽管算法能够每秒评估数百万只手,但速度非常慢。有没有更好的方法来检查两只手,而不是在所有可能的评估中使用 for 循环?

【问题讨论】:

  • 这部分代码并不是慢的部分,除非你多次循环这段代码,在这种情况下你可能有一个糟糕的代码设计。
  • 嵌套5个循环有什么意义?为什么不直接评估双手并比较结果?
  • @Malk 因为并非所有 7 张卡片都是已知的。例如,[Ac, 8c] Vs [9d,9h],我们现在需要 5 张棋盘牌,所以我们必须遍历所有可能的值才能得到 7 张牌。
  • 字,NP。如果您弄清楚如何在没有蛮力的情况下做到这一点,那么您将赢得互联网。一件事,在你的for循环中使用一个变量而不是cards.length。这是一个小数组,但每次迭代减少一次计算会有所帮助。
  • 另外,在循环之前将已发牌从数组中拉出可能会有所帮助。

标签: javascript node.js performance for-loop poker


【解决方案1】:

最简单的方法是通过 monte carlo。基本上,你只是随机生成剩余的手牌几千次,然后计算获胜次数并除以生成的手牌总数。您玩的手牌越多,结果就越准确。

【讨论】:

    猜你喜欢
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 2014-11-04
    相关资源
    最近更新 更多