有谁知道评估 7 张牌扑克手的快速算法?这比简单地强力检查一组 7 中每 21 张 5 张牌的组合更有效。
干杯,
皮特
我用JavaScript写了一个。核心评估方法仅使用位操作,因此非常快。考虑到这一点,查看 21 种组合仍然非常快。我们唯一需要更深入的时候是出现平局时。当这种情况发生时,我们需要研究更多细节,看看哪一手牌实际上是最好的 5 张牌。这是我想出的解决方案:
hands=["4 of a Kind", "Straight Flush", "Straight", "Flush", "High Card",
"1 Pair", "2 Pair", "Royal Flush", "3 of a Kind", "Full House" ];
var A=14, K=13, Q=12, J=11, _ = { "♠":1, "♣":2, "♥":4, "♦":8 };
//Calculates the Rank of a 5 card Poker hand using bit manipulations.
function rankPokerHand(cs,ss) {
var v, i, o, s = 1<<cs[0]|1<<cs[1]|1<<cs[2]|1<<cs[3]|1<<cs[4];
for (i=-1, v=o=0; i<5; i++, o=Math.pow(2,cs[i]*4)) {v += o*((v/o&15)+1);}
v = v % 15 - ((s/(s&-s) == 31) || (s == 0x403c) ? 3 : 1);
v -= (ss[0] == (ss[1]|ss[2]|ss[3]|ss[4])) * ((s == 0x7c00) ? -5 : 1);
document.write("Hand: "+hands[v]+((s == 0x403c)?" (Ace low)":"")+"<br/>");
}
//Royal Flush
rankPokerHand( [ 10, J, Q, K, A], [ _["♠"], _["♠"], _["♠"], _["♠"], _["♠"] ] );
该站点列出了一堆Poker Hand Evaluator 库,并提供了每个库的一些详细信息。其中大部分是针对 5 手牌的,但至少有一个针对 7 手牌的,称为The Snezee7 Evaluator。此外,该网站对用于快速分析扑克手牌的不同技术和算法进行了很好的概述。
我在几个不同的扑克项目中使用了 Pokersource Evaluator 的 Keith Rule C# Port,并认为它是一个优秀的库。您可以使用许多巧妙的技巧来制作真正快速的手动评估器,但编写代码需要大量工作,我强烈建议您使用现有的库。
很高兴你问:) 是的,这是一个全新的解决方案,可能只是门票:
代码:http
://code.google.com/p/specialkpokereval/
博客:http ://specialk-coding.blogspot.com/2010/04/texas-holdem-7-card-evaluator_23.html
此评估器的商业级演进可通过 iTunes Store 用于 iPhone/iPod Touch。它被称为“扑克王牌”。
在 James Devlin 的博客“ Coding The Wheel ”中可以找到各种解决方案的优秀总结并附有链接。
一位尚未讨论的评估者是Klaatu 的。
祝你好运!
我开发了一种用于 7 张牌手评估的算法,而无需迭代所有 21 种组合。
基本上,它将 7 张牌分为两类:同花和非同花。如果是同花顺,则很容易在 8192 个条目的表中查找该值。如果不是刷新,它将使用动态编程技术运行一个哈希函数,然后在 49205 个条目的哈希表中查找该值。
如果您有兴趣,请查看我在 github 上的工作。
我认为你应该做 21 种组合并使用某种 7462 表。第一名:任何 7 张牌都有 21 种不同的 5 张牌组合 第二名:每一个可能的最终扑克手牌 (2.598.960) 代表 7462 种不同手牌中的一种,所以,这很容易。
您只需查看每 21 种卡片组合,并针对每一种组合查看 7462 排名表的排名。http://www.sendspace.com/file/pet0dd
然后,对于我制作的这张 7462 表,对于每 7 张卡片,您将获得 21 个不同的排名。21个组合中排名最高的就是你想知道的那个。
理解表格:在每一行中,你都有 5 张牌(Z 代表同花,Y 非同花),并且你有它的排名。那只是你需要的。我给你表格和一个示例算法。这不是真正的代码。它是视觉基本格式,我现在就写了。可能不起作用,但你应该明白。代码将是这样的:
'############### 1st: Define your hand, for example "2c2d2h2s3c3h3s" #############################################################################################
Dim mycard As New ArrayList
mycard(1).Add("2c")
mycard(2).Add("2d")
mycard(3).Add("2h")
mycard(4).Add("2s")
mycard(5).Add("3c")
mycard(6).Add("3h")
mycard(7).Add("3s")
mycard.Sort() '################# you need to sort in alphabeticall order to match it later with 7462 table #############################################
' ################## 2nd: Let´s transform it to every kind of 5 cards combinations (21). It will also preserve the alphabeticall order ##################################
Dim myHand5 As String = ""
Dim suited as String = ""
Dim ranking as Integer = 0
Dim myranking as Integer = 7462
Dim mystring as String = ""
For cicle1 = 0 to 2
For cicle2 = cicle1 + 1 to 3
For cicle3 = cicle3 + 1 to 4
For cicle4 = cicle3 + 1 to 5
For cicle5 = cicle4 + 1 to 6
myhand5 = left(mycard(cicle1),1) & left(mycard(cicle2),1) & left(mycard(cicle3),1) & left(mycard(cicle4),1) & left(mycard(cicle5),1)
suited = left(mycard(cicle1),2) & left(mycard(cicle2),2) & left(mycard(cicle3),2) & left(mycard(cicle4),2) & left(mycard(cicle5),2)
if suited = "ccccc" or suited = "ddddd" or suited = "hhhhh" or suited = "sssss" then myhand5 = myhand5 & "Z" Else myhand5 = myhand5 & "Y"
ranking = 0
FileOpen (1, "7462.txt", Input)
Do
ranking = ranking + 1
Input(1, mystring)
Input(1, ranking)
If mystring = myhand5 Then
If ranking < myranking then myrankin = ranking
End If
Loop Until EOF(1)
FileClose(1)
Next cicle5
Next cicle4
Next cicle3
Next cicle2
Next cicle1
最终排名是 myranking 变量。你应该在不到一秒钟的时间内就知道你的手。并且也很好与其他手比较,因为你有排名值而不是它的名字。如果你想用扑克算法做点什么,这就是你应该开始的地方。有了排名值,一切都变得又快又容易。
注意:我不是程序员。我是一个想成为的人。我了解一些视觉基本功能。我希望我知道如何制作真正的程序。如果算法有效,请发表评论。如果您希望它非常非常快,我不知道该怎么做。我希望我有一个超快速的算法,可以让我(实时)检查我在比赛的每个阶段与任何对手的赔率。我尝试了很多算法来实时计算我在翻牌圈的赔率,但我能做到的最快是 30 秒。现在,我可以在 3 秒内计算出我在翻牌圈的赔率,但我使用的是一个 150 GB 的数据库,其中很多东西都是预先计算好的。如果您想实时了解您的赔率,您应该预先计算很多事情。我就是这样做的。
我在这里用 C 语言为扑克评估者创建了一个测试平台。在我测试的评估器中,poker-eval库是赢家。Steve Brecher 的 Holdem Showdown也非常快,并且内存需求明显减少。我自己的ACE_Eval拥有它自己的。
我欢迎帮助添加其他评估者,以及来自其他机器的测试结果的贡献。
当然,如果你想做得很快。我之前放的算法太慢了。
table7462 应该在数组中,而不是在文件中。
然后,您应该预先计算每张不同的 7 张牌并将其存储到数据库中。有 133.784.560 种不同的 7 张牌组合。
您应该使用这种格式(按字母顺序):
“2c2d2h2s3c3d3h”并对其进行排名
存储每 133.784.560 个不同的组合。你做 52C7 cicles,对其进行排序并将其存储在数据库中。也许几天后你就准备好了。准备好后,您不再需要 21 种组合,只需按字母顺序排序并在数据库中搜索即可。
如果您这样做,您会发现您可以在需要时实时计算与对手的赔率。
相信我。我不是程序员,我可以做到。我在 3 秒内就知道我在翻牌圈的赔率。
我开发了一个模拟器德州扑克,在此开发过程中,我发现翻牌圈有 7462 种独特组合(52 - 5/5 牌)。反过来,这个数字下降到 6075 (5/6),在河牌圈下降到 4824 (5/7)。这是因为 1 或 2 张牌与扑克手的分类无关。一个例子是:76543QK = 7654332 顺子(3 到 7)
我的模拟器叫做 Easy Poker,可以在我的网站http://crvltda.webs.com上找到
参考。Pokersoftware.com/forum
我可以推荐https://github.com/chenosaurus/poker-evaluator/
它是用 JavaScript 编写的,使用 128 MB HandRanks.dat 文件。
代码只有几行,很容易移植到任何其他语言。