Frage

Kennt jemand einen schnellen Algorithmus zur Bewertung von 7 Card Poker Händen? Etwas, das effizienter als einfach Brute-Force ist eine jede 21 5-Karten-Kombination aus den Händen von einem Satz von 7 zu überprüfen.

Cheers,

Pete

War es hilfreich?

Lösung

Diese Website listet eine Reihe von Poker Hand Evaluator Bibliotheken und gibt ein paar Details über jeden von ihnen. Die meisten von ihnen sind für 5-Karten Hände, aber es gibt zumindest eine für eine 7-Karten-Hand genannt Die Snezee7 Evaluator . Plus die Website gibt einen guten Überblick über die verschiedenen Techniken und Algorithmen verwendeten Schürhakenhände schnell zu analysieren.

habe ich den Keith-Regel C # Hafen des PSO Evaluator in ein paar verschiedenen verwendet Poker Projekte und denken dass es eine ausgezeichnete Bibliothek. Es gibt viele clevere Tricks, die Sie wirklich schnell Hand Gutachter machen können, aber den Code schreiben, ist eine Menge Arbeit, und ich würde sehr empfehlen eine bestehende Bibliothek.

Andere Tipps

schrieb ich eine in JavaScript . Die Kern Auswerteverfahren Anwendungen Bit nur Manipulationen so extrem schnell. In diesem Sinne, auf 21 Kombinationen suchen, ist immer noch sehr schnell. Das einzige Mal, dass wir tiefer gehen müssen, ist, wenn eine Bindung auftritt. Wenn dies geschieht, müssen wir in mehr Details zu sehen, welche 5 Karten in der Hand, um zu sehen eigentlich die beste ist. Hier ist die Lösung, die ich kam mit:

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],  [ _["♠"], _["♠"], _["♠"], _["♠"], _["♠"] ] ); 

Erläuterung Hier
Demo Hier

Gut, dass Sie gefragt :) Ja, hier ist eine völlig neue Lösung, die genau das Richtige sein kann:

Code: http://code.google.com/p/specialkpokereval/ < br> Blog: http: //specialk-coding.blogspot .com / 2010/04 / Texas-Holdem-7-card-evaluator_23.html

Eine handelsüblichem Entwicklung dieser Evaluator ist für das iPhone / iPod Touch über iTunes Store erhältlich. Es heißt " Poker Ace ".

Eine ausgezeichnete Zusammenfassung der verschiedenen Lösungen komplett mit Links auf James Devlin Blog „gefunden Coding The Wheel “.

Ein Auswerter noch nicht besprochen gibt es Klaatus .

Viel Glück!

entwickelte ich einen Algorithmus für die 7-Karten-Hand Bewertung ohne alle 21 Kombinationen laufen.

Im Grunde ist es spaltet die 7-Karten in der Hand in zwei Kategorien: bündig und nicht bündig. Wenn es ein Flush ist, wäre es leicht, den Wert in einer Tabelle von 8192 Einträgen zu suchen. Wenn es nicht ein Flush ist, wird es eine Hash-Funktion mit Techniken der dynamischen Programmierung auszuführen, und dann den Wert in einer Hash-Tabelle von 49205 Einträgen nachschlagen.

Wenn Sie interessiert sind, bitte meine Arbeit bei Github überprüfen.

https://github.com/HenryRLee/PokerHandEvaluator

Ich habe rel="nofollow"> hier ein Testbed für Poker Evaluatoren in C Poker-eval Bibliothek der Gewinner. Steve Brechers Holdem Showdown auch recht schnell war und deutlich weniger Speicherbedarf hatte. Meine eigene ACE_Eval hielt es seine eigene.

Ich würde willkommen Hilfe beim Hinzufügen von anderen Gutachtern und Beiträge der Testergebnisse von anderen Maschinen.

Ich glaube, Sie sollten die 21 Kombinationen tun und eine Art von 7462 Tabelle verwenden. 1. Platz: alle 7 Karten haben 21 verschiedene 5-Karten-Kombinationen 2. Platz: alle möglichen endgültigen Schürhakenhände (2.598.960) stellt einen von 7462 anderer Art von Händen so, es ist einfach.

Sie müssen nur Blick auf alle 21 Kombinationen Ihrer Karten und für jeden, der Rangliste der 7462-Ranking Tabelle. http://www.sendspace.com/file/pet0dd

Dann wird für jeweils 7 Karten werden Ihnen 21 verschiedene Klassifizierungen von diesem 7462 Tabelle habe ich gemacht. Die ranghöchste von 21 Kombinationen ist, die Sie wissen wollen.

Um die Tabelle zu verstehen: In jeder Zeile haben Sie die 5-Karten-Hand (Z für geeignet, Y nicht geeignet), und Sie haben es den Ranking. Das ist nur brauchen Sie. Ich gebe Ihnen die Tabelle und ein Beispiel-Algorithmus. Es ist der Code nicht wirklich. Es ist Visual Basic-Format, und ich schrieb es jetzt. nicht funktioniert wahrscheinlich, aber Sie sollten verstehen. Der Code würde wie folgt sein:

'############### 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

Schlussrangliste myranking variabel. Sie sollten Ihre Hand in weniger als einer Sekunde wissen. Und ist auch gut mit anderen Händen zu vergleichen, weil Sie den Rangwert nicht den Namen davon. Und wenn Sie etwas mit Poker-Algorithmen tun wollen, das ist, wo man beginnen soll. Mit Ranking Werten ist alles schnell und einfach.

Hinweis: Ich bin kein Programmierer. Ich bin ein sein Wanna. Ich verstehe einige visuelle Grundfunktionen. Ich wünsche ich wusste, wie real-Programme zu machen. Wenn der Algorithmus funktioniert, lassen Sie einen Kommentar. Wenn Sie es wünschen sehr, sehr schnell sein, weiß ich nicht, wie es zu tun. Ich wünsche, ich habe einen ultraschnellen Algorithmus, den ich (in Echtzeit) meine Chancen gegen alle Gegner in jeder Phase des Spiels überprüfen kann. Ich habe versucht, viele Algorithmen, um meine Chancen auf dem Flop in Echtzeit zu berechnen, aber die schnellsten kann i sind 30 Sekunden. Jetzt kann ich meine Chancen auf dem Flop in 3 Sekunden berechnen, aber ich benutze eine 150 Gigabyte Datenbank mit vielen Dingen im Voraus berechnet. Wenn Sie Ihre Chancen wissen, in Echtzeit wollen, sollten Sie viele Dinge vorausberechnet. Das ist, wie ich es tat.

Natürlich, wenn Sie es sehr schnell tun wollen. Der Algorithmus i vor setzen ist zu langsam.

Die table7462 shoul in einem Array, nicht in einer Datei.

Dann sollten Sie alle verschiedenen 7cards Hände vorberechnet und speichern sie in einer Datenbank. Es gibt 133.784.560 verschiedene 7cards Kombinationen.

Sie sollten dieses Format verwenden (alphabeticall Reihenfolge):

"2c2d2h2s3c3d3h" und rank it

Shop alle 133.784.560 unterschiedliche Kombinationen. Sie tun 52C7 cicles, Rang sie und speichert sie in einer Datenbank. Vielleicht in ein paar Tagen haben Sie es bereit. Wenn Sie es fertig haben, eröffnen Sie bitte ein Bedarf 21 Kombinationen mehr, nur die Hand für sie in Ihrer Datenbank in alphabetischer Reihenfolge und suchen Sie setzen sortiert.

Wenn Sie das tun, du wirst sehen, dass Sie Ihre Chancen gegen Ihre Gegner in Echtzeit berechnen kann, wann immer Sie benötigen.

Glauben Sie mir. Ich bin kein Programmierer, und ich kann es tun. Ich weiß, dass meine Chancen auf dem Flop in 3 Sekunden.

entwickelte ich einen Simulator Texas hold'em und während dieser Entwicklung fand ich die Anzahl der 7462 einzigartige Kombinationen (52 - 5/5 Karten) auf dem Flop. Im Gegenzug sinkt diese Zahl auf 6075 (5/6) und im Fluss zu 4824 (5/7). Dies liegt daran, 1 oder 2 Karten irrelevant sind in der Poker-Hand zu klassifizieren. Ein Beispiel ist: 76543QK = 7.654.332 ein gerade (3 bis 7)

Mein Simulator ist einfach Poker genannt und ist in meiner Website http://crvltda.webs.com

Ref. Pokersoftware.com/forum

May Ich empfehle https://github.com/chenosaurus/poker-evaluator/

Es ist in JavaScript geschrieben und verwendet eine 128 MB HandRanks.dat Datei.

Der Code ist nur ein paar Zeilen und sehr einfach in dem Hafen eine andere Sprache.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top