Algorithm 7卡扑克手评估器

Algorithm 7卡扑克手评估器,algorithm,poker,playing-cards,Algorithm,Poker,Playing Cards,有人知道一个快速算法来评估7张扑克牌吗?这比简单的暴力检查每21张5张牌组合的7张牌更有效 干杯 Pete这个网站列出了一系列的问题,并给出了每个问题的一些细节。大多数是5张牌,但至少有一张是7张牌。此外,该网站还提供了用于快速分析扑克牌的各种技术和算法的详细概述 我在几个不同的版本中使用了Pokersource Evaluator的Keith Rule C#Port,认为它是一个优秀的库。您可以使用许多聪明的技巧来制作真正快速的计算器,但是编写代码需要大量的工作,我强烈建议您使用现有的库。很高

有人知道一个快速算法来评估7张扑克牌吗?这比简单的暴力检查每21张5张牌组合的7张牌更有效

干杯


Pete

这个网站列出了一系列的问题,并给出了每个问题的一些细节。大多数是5张牌,但至少有一张是7张牌。此外,该网站还提供了用于快速分析扑克牌的各种技术和算法的详细概述

我在几个不同的版本中使用了Pokersource Evaluator的Keith Rule C#Port,认为它是一个优秀的库。您可以使用许多聪明的技巧来制作真正快速的计算器,但是编写代码需要大量的工作,我强烈建议您使用现有的库。

很高兴您问:)是的,这里有一个全新的解决方案,可能就是其中之一:

代码:
博客:

iPhone/iPod Touch可通过iTunes商店获得此evaluator的商业级升级版。它被称为“”

詹姆斯·德夫林(James Devlin)的博客“”中提供了各种解决方案的精彩摘要,并提供了完整的链接

还有一个评估者尚未讨论

祝你好运

我用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],  [ _["♠"], _["♠"], _["♠"], _["♠"], _["♠"] ] ); 
hands=[“4张同类牌”、“同花顺牌”、“同花顺牌”、“高牌”,
“1双”、“2双”、“皇家同花顺”、“同类3双”、“满座”];
变量A=14,K=13,Q=12,J=11,{”♠":1, "♣":2, "♥":4, "♦":8 };
//使用位操作计算5张牌扑克手的等级。
函数rankPokerHand(cs、ss){

var v,i,o,s=1我认为你应该做21个组合,并使用某种7462表格。 第一:任何7张牌都有21种不同的5张牌组合 第二:每个可能的最后一手牌(2.598.960)代表7462种不同类型的牌中的一种 所以,这很容易

您只需查看您的卡牌的每21种组合,每一种组合,请参见7462排名表的排名

然后,对于每7张牌,你将从我制作的7462表中获得21个不同的排名。21个组合中排名最高的是你想知道的

了解表格:在每一行你都有5张牌(Z代表适合,Y代表不适合)你有它的排名。这只是你需要的。我给你一个表格和一个示例算法。它不是真正的代码。它是visual basic格式,我现在就写了。可能不起作用,但你应该理解。代码应该是这样的:

'############### 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
“1:定义你的手,例如“2c2d2h2s3c3h3s”#############################################################################################
将mycard暗显为新阵列列表
mycard(1).添加(“2c”)
mycard(2).添加(“2d”)
mycard(3)。添加(“2h”)
mycard(4).添加(“2s”)
mycard(5)。添加(“3c”)
mycard(6)。添加(“3h”)
mycard(7)。添加(“3s”)
mycard.Sort()’您需要按字母顺序排序,以便稍后与7462表匹配#############################################
第二:让我们将其转换为各种5种卡片组合(21)。它还将保留字母顺序##################################
将myHand5设置为字符串=“”
如String=“”所示
Dim排名为整数=0
Dim myranking为整数=7462
Dim mystring as String=“”
对于cicle1=0到2
对于cicle2=cicle1+1到3
对于cicle3=cicle3+1至4
对于cicle4=cicle3+1至5
对于cicle5=cicle4+1至6
myhand5=左(mycard(cicle1),1)&左(mycard(cicle2),1)&左(mycard(cicle3),1)&左(mycard(cicle4),1)&左(mycard(cicle5),1)
适合=左(我的卡(cicle1),2)和左(我的卡(cicle2),2)和左(我的卡(cicle3),2)和左(我的卡(cicle4),2)和左(我的卡(cicle5),2)
如果fitted=“ccccc”或fitted=“ddddd”或fitted=“hhhh”或fitted=“sssss”,则myhand5=myhand5&“Z”,否则myhand5=myhand5&“Y”
排名=0
文件打开(1,“7462.txt”,输入)
做
排名=排名+1
输入(1,mystring)
输入(1,排名)
如果mystring=myhand5,则
如果排名
最终排名是我的排名变量。你应该在不到一秒钟的时间内知道你的手牌。与其他手牌相比也很好,因为你有排名值,而不是它的名称。如果你想用扑克算法做些什么,这就是你应该开始的地方。有了排名值,一切都是快速而简单的

注:我不是程序员。我想成为。我了解一些visual basic函数。我知道如何制作真正的程序。如果算法有效,请留下评论。如果你想让它非常非常快,我不知道怎么做。我想我有一个超快的算法,允许我检查(实时)我在比赛的每个阶段都会与任何对手较量。我尝试了很多算法来实时计算我在翻牌时的赔率,但最快的是30秒。现在,我可以在3秒钟内计算我在翻牌时的赔率,但我使用了一个150 GB的数据库,其中包含许多预先计算的内容。如果你想知道你的赔率