题
有谁知道评估 7 张牌扑克牌的快速算法吗?这比简单地暴力检查 7 组牌中每 21 个 5 张牌的组合更有效。
干杯,
皮特
解决方案
这个网站列出了一堆 扑克牌评估器库 并给出了每个的一些细节。大多数是针对 5 张牌的,但至少有一种是针对 7 张牌的,称为 Snezee7 评估器. 。此外,该网站还全面概述了用于快速分析扑克手牌的不同技术和算法。
我在几个不同的项目中使用了 Pokersource Evaluator 的 Keith Rule C# Port 扑克项目 并认为这是一个优秀的图书馆。您可以使用许多巧妙的技巧来制作真正快速的手动评估器,但编写代码需要大量工作,我强烈建议使用现有的库。
其他提示
我写一个在的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], [ _["♠"], _["♠"], _["♠"], _["♠"], _["♠"] ] );
很高兴你问:)是的,这里有一个全新的解决方案,可能只是门票:
代码: http://code.google.com/p/specialkpokereval/ < BR> 博客: HTTP://specialk-coding.blogspot的.com / 2010/04 /得克萨斯-扑克-7-卡evaluator_23.html
该评估的商业级进化是可以通过iTunes商店的iPhone / iPod Touch的。这就是所谓的 “扑克王牌的。”
完成链路中不同的解决方案的一个很好的总结是詹姆斯·德夫林的博客“发现编码轮子”。
一个评价者尚未讨论有克拉图的一>
祝你好运!
我开发了7张牌评估的算法不反复所有21种组合。
基本上,它将该7张牌分为两类:齐平,而不是齐平。如果它是一个平齐,这将是很容易查找的价值在8192个条目表。如果它不是一个冲水,它会运行与动态规划技术哈希函数,然后在49205个条目的哈希表中查找的数值。
如果您有兴趣,请在github上我的工作。
我已经创建了用C 这里。我测试的评估中,扑克-EVAL 库是赢家。 史蒂夫·布雷彻的扑克摊牌得也比较快,有显著更少的内存需求。我自己的 ACE_Eval 举办它自己。
我希望能帮助增加其它评估,并从其他机器测试结果的贡献。
我认为你应该做的21个组合,并使用某种类型的7462表格。 第一:任何7卡具有21层不同的5层牌的组合 第二:每一个可能的最终手牌(2.598.960)代表7462别样手之一 因此,你会很容易。
您只需要看看你的卡每21个组合,并为每一个,见7462排名表的排名。 http://www.sendspace.com/file/pet0dd
然后,对于每个卡7你将不得不从该7462表I由21个不同的排名。排名最高的21个组合是你想知道的一个。
要理解的表:在每一行你有5张牌(Z为适合,Y非适合)并且已在它的排名。 That's只有你的需要。我给你的表和示例算法。 It's不是真正的代码。 It's视觉基本格式,我现在写的。大概doesn't的工作,但你应该明白。该代码将是这样的:
'############### 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千兆字节数据库预先计算。如果您想知道您的实时赔率你应该有很多事情预先计算。 That's我是否满意。
当然,如果你想这样做非常快。我把之前的算法是太慢了。
在table7462建议立即进行删除在数组,而不是在一个文件中。
然后,你应该预先计算每一个不同的7cards手,并将其存储到数据库中。有133.784.560不同7cards组合。
您应使用此格式(alphabeticall顺序):
“2c2d2h2s3c3d3h” 和秩它
存储每133.784.560不同组合。你做52C7圈子中,排名,并将其存储在数据库中。 也许在几天之内你必须准备好。 当你拥有它准备好了,你鸵鸟政策需要21个组合了,只要把你的手按字母顺序排序,并在数据库中进行搜索。
如果你这样做,则将会看到,你可以计算出你的赔率对你的对手时实时需要。
相信我。我不是一个程序员,我能做到这一点。我知道我的可能性在3秒触发器。
我开发一个模拟器德州扑克和此开发过程中,我发现的7462个独特组合的数量 - 在翻(52 5/5卡)。反过来,这个数字下降到6075(5/6),并在河边4824(5/7)。这是因为:1张或2卡在手牌进行分类无关。一个例子是: 76543QK = 7654332一个直的(3〜7)
我的模拟器被称为简易扑克,是在我的网站 http://crvltda.webs.com使用
参考。 Pokersoftware.com/forum
五月我推荐 https://github.com/chenosaurus/poker-evaluator/
这是写在JavaScript和使用128 MB HandRanks.dat文件。
在代码仅仅是几行,很容易地移植到任何其他语言。