AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Poker Simulator

Ein Thema von henryhux · begonnen am 26. Sep 2010 · letzter Beitrag vom 27. Sep 2010
Antwort Antwort
henryhux

Registriert seit: 25. Sep 2010
7 Beiträge
 
#1

Poker Simulator

  Alt 26. Sep 2010, 17:33
Delphi-Version: 7
Hi,

das ist mein erster Beitrag hier
Direkt zur Sache: Ich wollte einen Razz Simulator programmieren, habe bis jetzt aber noch keinen Ansatz gefunden.
Bei dem Spiel werden insg. 7 Karten ausgeteilt.
Zuerst 3 und dann bis zur 7ten Karte immer ein.
Dabei gibt es keine Flushs oder straights oder sonst so etwas. Die beste Hand ist A2345, also die niedrigsten Hände zählen.
Wie gesagt wollte ich durch Simulationen herausfinden wie groß meine Chancen sind, gegen einen einzigen Gegner.
Wie realisiere ich das?


Danke

Lg

Henry
  Mit Zitat antworten Zitat
Maximus

Registriert seit: 26. Okt 2003
169 Beiträge
 
#2

AW: Poker Simulator

  Alt 26. Sep 2010, 19:29
Hallo,

ich befürchte da bleibt dir nichts anderes übrig als alle Möglichkeiten durchzuprobieren. Stellst du das geschickt an sollte sich der Aufwand sogar in Grenzen halten.

Vielleicht hilft dir dieser Link weiter: http://www.pst.ifi.lmu.de/~hammer/poker/handeval.html
Ist zwar für Texas Hold'em aber das Prinzip sollte auch für Razz gelten.

Vereinfacht gesagt ordnest du die Hände bestimmten Klassen zu die in einer Rangordnung sind und kannst dann einfach den Rang beider Hände vergleichen.

Viele Grüße,
Maximus
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#3

AW: Poker Simulator

  Alt 26. Sep 2010, 19:36
Edit: @Maximus: Beim Razz gibt es ja praktisch keine "Hände" die aus Kombinationen ihre Wertigkeit beziehen, daher ist das etwas einfacher. Muss also an sich nichtmal wirklich "simuliert" werden.

Letztlich ist es beim Razz sogar fast simpel, da ja (zunächst mal) nur wichtig ist, dass der Gegner mind. eine höhere Karte hat, als man selbst.

Hast du selber z.B. vor den Streets 2 5 T, muss der Gegner also min. einen J haben um schon schlechter zu sein. Du weisst, dass eine 2, eine 5 und eine T raus sind, und insgesamt 52 Karten existieren. Dein Gegner muss nun also eine der Könige, Damen, Buben oder Zehner haben, was 12+3=15 mögliche Karten sind - und zwar aus 49, weil 3 hast du ja schon selbst. Der Gegner kann also nun noch (49 über 3) = 18.424 mögliche Starthände haben. (34 über 3) = 5.984 davon sind ohne die o.g. 15 Karten, also besser als du. Der Gegner ist also zu (5984/18424) = 32,48% besser.

Seine Chance auch eine T hoch zu haben: Da du selber bereits eine hast, sind noch drei Zehnen im Deck. Mit den Zehnern gibt es (37 über 3) = 7.770 mögliche Starthände, abzüglich der oben berechneten ohne die Zehner bleiben 7770-5984=1786 Starthände mit mindestens einer Zehn. Dein Gegner ist also zu (1786/18424) = 9,7% gleich gut bzgl. eurer höchsten Karte.

Deine zweit-höchste ist eine 5. Der Gegner muss also als seine zweit-höchste etwas <5 haben um besser zu sein. Der Gegner muss nun noch eine 5, 6, 7, 8, 9 oder T haben um schlechter zu sein. Es gibt noch (48 über 2) = 1.128 mögliche Kombinationen der restlichen zwei Karten, davon sind ((48-22) über 2) = 325 besser als du (also ohne 5er, 6er, 7er 8er usw.). Wenn ihr also die gleiche höchste Karte habt, besteht noch eine Chance von (325/1128) = 28,8% für den Gegner besser zu sein. 32,48% + 9,7%*28,8% = 35,27% Gesamtchance, dass der Gegner besser ist bisher.

Die Chance, dass der Gegner auch eine 5 hat: ((48-19) über 2) - ((48-22) über 2) = 406 - 325 = 81 Kombinationen mit einer 5. Aus 1128 möglichen hat dies 7,2%.

Du hast jetzt noch eine 2. Es gibt noch 47 Karten, die der Gegner haben könnte. Um besser zu sein, müsste es ein Ass sein, derer gibt es vier. Also zu (4/47)=8,5% wahrscheinlich. 35,27% + 7,2%*8,5% = 35,88%

Wenn du also mit 2 5 T startest, ist diese Hand zu 64,12% die bessere von euch beiden!


Ich hab hier bewusst alles über Kombinatorik gemacht, man könnte auch statistisch dran gehen, wozu man aber entsprechende Tabellen ins Programm bringen müsste. Ich hoffe auch, dass ich keine wirklich groben Schnitzer drin hab!
Auf Grund dieses Gedankengangen müsste es gehen ein generelles Vorgehen abzuleiten.


--------------------

Mir fällt gerade ein: Paare werden zusammengelegt oder? Also bei A 3 3 5 7 9 J J wäre die zu zählende Hand A3579, nicht A3357 oder? Nun, der Grundgedanke bleibt: Schauen, welche Karten der Gegner NICHT haben darf, wie viele noch frei verteilt sein können, die Differenz daraus über so viele Karten setzen wie noch unausgewertet sind = Chance des Gegners wirklich besser zu sein. Dann Chance gleich zu sein, und das mal der Chance in der nächsten Karte zu verlieren, usw. usf. bis nur noch eine unausgewertete Karte besteht.
In Worten der Wahrscheinlichkeitstheorie wäre dass dann die "Wahrscheinlichkeit besser als N1 zu sein, plus der Wahrscheinlichkeit gleich N1 zu sein mal der Wahrscheinlichkeit in N2 besser zu sein, plus der Wahrscheinlichkeit in N2 gleich zu sein mal der Wahrscheinlichkeit in N3 besser zu sein, uuuund so weiter".


Edit: Etwas anderes ist dann noch die Wahrscheinlichkeit, dass dein Gegner in der nächsten Karte besser ist als du, aber auch das ist kombinatorisch zu lösen.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
henryhux

Registriert seit: 25. Sep 2010
7 Beiträge
 
#4

AW: Poker Simulator

  Alt 26. Sep 2010, 20:47
Ok, danke. Die Ideen sind ganz gut, dennoch mit ein paar Fehlern. Höhere Karte -> besser. Siehe : http://beta.propokertools.com/simula...1=A23K&h2=T987
Gerade eben ist mir aber nen Gedanke gekommen, und ich wollt mal wissen, was ihr davon haltet.
Erstmal angenommen ich kenne die gegn. Hand, dann:

- Habe ich meine Hand und seine
- Ich nehme eine hohe Anzahl von möglichen Kombinationen von schlecht bis gut (sprich a2345 bis zb. 568jk, einfach nur repräsentative Werte)
- Ich prüfe meine Hand auf die Kombinationen die ich erreichen kann und kriege ein Ergebnis zb. 80/100
- Ich prüfe seine Hand auf alle Kombinationen, die er erreichen kann, meinetwegen 60/100

= Ich weiß, dass ich eine höhere Anzahl an Möglichkeiten habe und somit öfter in der Situation gewinne.

Was haltet ihr von dem Ansatz? Realisierbar? Präzise? Gut?

Danke,

Lg

Henry


EDIT: Wenn ich hier ein Beispiel von einem gut gelösten Sim geschrieben in C zeigen würde, könntet ihr mir sagen welcher Idee dem zum Grunde liegt?
EDIT2: Hier ist es in C geschrieben. Die Links mit dem Source-Code sind im Text "versteckt".

Geändert von henryhux (26. Sep 2010 um 21:24 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#5

AW: Poker Simulator

  Alt 27. Sep 2010, 01:02
Höhere Karte -> besser.
Razz = Rats = schlechteste Hand, Gegenteil zu den Nuts. Beim Razz gewinnt die Hand, die die niedrigste höchste Karte aufweist. Bedenke, dass das dabei Ass als 1 gewertet wird, also im weitesten Sinne "beste" Karte bleibt.
Ich habe auch gerade gemerkt, dass es durchaus Paare und Drillinge beim Razz gibt, weil ja auch nicht sicher ist, dass man immer mindestens 5 unterschiedliche Karten hat. Das macht dann die rein kombinatorische Lösung leider kaputt, sorry.

Du müstest eventuell auch noch etwas genauer fragen. Welche Wahrscheinlichkeit willst du genau? Die, dass du im Moment die bessere Hand hälst (s.o.)? Die, mit der dein Gegner noch besser wird als du? Die, mit der du die gesamte Hand gewinnst, basierend auf allem was du gerade siehst, und was noch kommen könnte?

Mal noch ne Portion Mathe, einfach nur für den Überblick.
Bei zwei Spielern gibt es insgesamt (52 über 14) = 1.768.966.344.600 mögliche Spiele.
Nach den ersten je 3 Karten noch (48 über 8) = 377.348.994 (52-4=48, man sieht ja seine eigenen 3 und eine vom Gegner)
Nach den ersten 4 (46 über 6) = 9.366.819
Nach dem 5th street (44 über 4) = 135.751
Nach dem 6th street (42 über 2) = 861

Bei gleichverteiltem Zufallsgenerator (was der Delphi-eigene ist, so lange man ihn nicht missbraucht), wenn du bei 377.348.994 möglichen Händen eine Schätzung machen willst, die nur in 1% aller Fälle verkehrt ist, brauchst du (nach konservativem Ansatz) mindestens n=(377.348.994*0,25*2,58²) / (377.348.993*0,01² + 0,25*2,58²) = 627946460,9154 / 37736,5634 ~= 16.641 Proben. Das ist super flott gemacht, sagt dann aber auch NUR aus, ob du wahrscheinlich gewinnst, oder nicht! Es trifft ÜBERHAUPT keine verwertbare Aussage darüber, wie diese Chancen nun wirklich stehen! Also im Bezug auf Setzhöhe (Pot-Odds) nicht wirklich brauchbar.

Dreht man das um, und du weisst ca. wie viele Proben du zeitlich hin bekommst, könnte man die Aussagequalität noch verbessern. Angenommen, du kannst dir 200.000 Proben erlauben:
200000=(377.348.994*0,25*2,58²) / (377.348.993*a² + 0,25*2,58²) <=>
a = sqrt((0,25*2,58²)/200000) = 0,00288
Das heisst, nach 200000 Proben weisst du mit 99,7%iger Sicherheit, wer das Spiel gewinnen wird. Nach den ersten 3 gegebenen Karten. Das kommt mir zwar gerade zu gut vor, aber um die Uhrzeit schau ich jetzt nicht nochmal genauer in meinen alten Statistikunterlagen nach
Aber so an sich...

Zitat:
EDIT2: Hier ist es in C geschrieben. Die Links mit dem Source-Code sind im Text "versteckt".
Auf Suchspiele haben wir hier eher selten Lust - zumindest wenn es nichts zu gewinnen gibt

Zum wichtigeren Teil! *hust*

Zum Vorgehen in Delphi: 2 Arrays of Integer, 0 = keine Karte, 1-13 = Ass bis König. Die Arrays sortiert halten. Deine ersten 3 Karten in eines schreiben, die eine offene des Gegners in das andere. Die Nullen durch den Zufallsgenerator mit 1-13 füllen (natürlich so, dass keine unmögliche "Gebungen" auftauchen!*), sortieren, und die 5 niedrigsten ohne doppelte daraus in 2 neue 5-Elementige Arrays schieben. Ist ein 5er-Array noch nicht voll, den niedrigsten verbleibenden Wert aus dem 7er "Mutter-Array" reinschieben, usw. Dabei gleich mal separat merken, dass ein Paar entstanden ist, d.h. sollte sich das zweite Array nicht paaren, ist schon klar wer gewinnt. Diese 5er Arrays dann sortieren, und wenn gleich viele bzw. keine "Figuren" (Paare usw.) enthalten sind, von oben nach unten vergleichen. Der, der als erstes eine niedrigere Zahl hat als der andere ist der Gewinner.
*) Am einfachsten machbar durch ein Array der Länge 52, in das dann "1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4...." geschrieben wird, die bekannten entfernt, und dann per Zufallsgenerator gemischt (findet sich einiges zu im Forum hier).

Sowas sollte sich in ein paar Sekündchen ein paar zigtausend mal gut machen lassen, so dass du zumindest was die Aussage "ich gewinne" oder "ich verliere" zu recht brauchbaren Werten kommst. Nur für die genauen Wahrscheinlichkeiten müsste man erheblich mehr Proben ansetzen. Erheblich. Und Razz ist dabei noch ein vergleichsweise super-simpler Fall, da die Farben ja keine Rolle spielen
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium (27. Sep 2010 um 01:11 Uhr)
  Mit Zitat antworten Zitat
henryhux

Registriert seit: 25. Sep 2010
7 Beiträge
 
#6

AW: Poker Simulator

  Alt 27. Sep 2010, 14:49
Hi,

also die Idee ist wirklich gut. Nur leider sind meine Kenntnisse für so etwas sehr beschränkt.

Da ich auch mit vielen Hilfen nicht weiterkomme und ich das Programm nicht links liegen lassen will, biete ich demjenigen, der mir das Programm in Delphi schreibt und mir den Quellcode schickt, 50€ per Paypal. Das Geld würde ich derjenigen Person dann geben, wenn er mir über Screenshots zeigen könnte, dass das Programm klappt, unter 3-4 Sekunden bleibt und eine Abweichung von maximal 2% aufweist. Dazu müsste er die Funktion haben, Gegner auf Ranges zu setzen.
Insgesamt sollte er die gleichen Funktionen haben wie der Razz Simulator von http://propokertools.com/simulations .
Ich denke, dass es gut möglich ist das Programm sehr klein zu halten. Das wäre völlig egal, hauptsache es erfüllt die oben genannten Funktionen.

Danke =)

Lg

Henry


EDIT: Wenn sich jemand dadran wagen will, soll er mir eine PN schicken, damit ich weiß ob evtl zwei Leute dran sind.
EDIT2: Natürlich gibt es auch noch die C-Files, die man als Hilfe nehmen könnte.

Geändert von henryhux (27. Sep 2010 um 16:29 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz