【发布时间】: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