Zähler im Equilaor

    • NablaO
      NablaO
      Bronze
      Dabei seit: 23.01.2009 Beiträge: 12
      Vorweg: In erster Linie ist die Frage an die Entwickler des Equilator gerichtet. Aber evtl. haben dich ja auch andere schon mit folgendem Problem beschäftigt.

      Ich schreibe gerade an einem Programm, welches u.a. die Funktionen des Equilator beherrscht bzw. diese zur Berechnung anderere Dinge braucht.

      Ich schildere mal den worst-case, um auf den Kern meines Problems aufmerksam zu machen:

      Es befidnen sich 10 Spieler im Pot (alle all-in und alle gleicher Chipstand). Wenn ich nun alle möglchen Board-Karten hinlege (was gar nicht mal so viele sind, nämlich choose(32,5) = "32 über 5" = 201376) kann man in jeder Sitation bestimmen wer Gewinner ist, wer Zweiter ist usw. Die Wahrscheinlichkeit für eine bestimmte Gewinnsitution (z.B.: die Spieler heißen A,...,J; Gewinnsituation: 1.A, 2.B, 3.C, ... 10.J) ist einfach die Zahl N wie oft diese Situation vorkommt dividiert durch alle möglichen Situationen, also N/choose(32,5).

      Aber: Wie gestallte ich vernünftige Zähler für die verschiedenen Gewinnsituationen.

      Ok, um mal einen naiven Weg aufzuzeigen:
      erstelle ein integer-Array mit 2^100 Elementen. Dabei ist jedes Array-Element ein Zähler für eine bestimmte Gewinnsituation, wobei die Offset-Adresse des Array-Elements die Gewinnsituation codiert: In diesem aus 100 Bits bestehenden Bitfeld sind jeweils 10 bit für jeden Platz reserviert, wobei ein gesetztes bit an der Stelle 4 (z.B.) im Bitfeld für der ertsen Platz bedeutet, dass der Spieler 4 (also D) den ersten Platz belegt.
      Noch ein Beispiel um diese naive Mothode zu illustrienen:
      counter[0...01111111111]=1243 (0...0 soll hier 90 Nullen bedeuten) würde bedeuten, dass die Gewinn-Situation Spieler 1, Spieler 2, ..., Spieler 10 belegen den ersten Platz 1243mal vorgekommen ist (da das letzte 10er-Bitfeld die Spieler codiert , die den ersten Platz belegen und hier nunmal alle Bits gestzt sind).

      So lange rumgeredet... Aber diese Methode ist scheiße, da sie VIEL zu VIEL Speicher verschlingt (nämlich bei integers, welche 4Bytes brauchen, genau: 2^100*4Bytes)

      btw: auch wenn man diese naive Methode etwas verfeinert (z.B. falls ein Spieler Platz eins belegt ihn im Bitfeld füer Platz 2 bis 10 einfach wegzulassen, so dass dort nur noch neun bits beötigt werden bits, usw.) brigt einen nicht wirklich vorwärts.

      Deshalb die Frage: Wie gestalltet man geschickt Zähler, so dass jede mögliche Gewinn-Situation erfasst wird und der Speicherbedarf nicht explodiert.
  • 2 Antworten
    • AcesWing
      AcesWing
      Bronze
      Dabei seit: 07.04.2007 Beiträge: 376
      Da du 201376 mögliche Gewinnsituationen hast, brauchst du doch nur ein Array mit eben so vielen Elementen. Anbieten würde sich doch ein zweidimensionales Byte-Array mit 10x201376 Elementen. So kannst du für jede Gewinnsituation die Plazierung aller Spieler erfassen.
    • NablaO
      NablaO
      Bronze
      Dabei seit: 23.01.2009 Beiträge: 12
      Es gibt zwar nur 201376 verschiedene Kombinationen von Boardkarten, insofern auch nur 201376 verschiedene Gewinnsituationen, aber für mich ist es nicht offensichtlich welche von den choose(100,10)=1,731030946*10^13 Gewinnsituationen wegfallen. Auch dürften die Gewinnsituationen, die rausfallen, von den konkreten Händen abhängen, die die Spieler halten. Insofern eignet sich die Methode nicht, wenn man handranges gegen einander antreten lässt.