Ich habe über eine schnelle Bewertung der Pokerhand in Python nachgedacht. Mir kam der Gedanke, dass eine Möglichkeit, den Prozess zu beschleunigen, darin besteht, alle Kartenflächen und Farben als Primzahlen darzustellen und sie zu multiplizieren, um die Hände darzustellen. Zu wissen:
class PokerCard:
faces = '23456789TJQKA'
suits = 'cdhs'
facePrimes = [11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 53, 59, 61]
suitPrimes = [2, 3, 5, 7]
UND
def HashVal(self):
return PokerCard.facePrimes[self.cardFace] * PokerCard.suitPrimes[self.cardSuit]
Dies würde jeder Hand einen numerischen Wert geben, der mir durch Modulo sagen könnte, wie viele Könige in der Hand sind oder wie viele Herzen. Zum Beispiel würde jede Hand mit fünf oder mehr Schlägern gleichmäßig durch 2 ^ 5 teilen; Jede Hand mit vier Königen würde sich gleichmäßig durch 59 ^ 4 usw. teilen.
Das Problem ist, dass eine Hand mit sieben Karten wie AcAdAhAsKdKhKs einen Hash-Wert von ungefähr 62,7 Billiarden hat, was eine interne Darstellung erheblich mehr als 32 Bit erfordern würde. Gibt es eine Möglichkeit, so große Zahlen in Python zu speichern, dass ich arithmetische Operationen ausführen kann?
quelle
Antworten:
Python unterstützt einen Integer-Typ "bignum", der mit beliebig großen Zahlen arbeiten kann. In Python 2.5+ wird dieser Typ aufgerufen
long
und ist vomint
Typ getrennt, aber der Interpreter verwendet automatisch den geeigneten Typ. In Python 3.0+ wurde derint
Typ vollständig gelöscht.Dies ist jedoch nur ein Implementierungsdetail. Solange Sie Version 2.5 oder besser haben, führen Sie einfach Standard-Mathematikoperationen aus, und jede Zahl, die die Grenzen der 32-Bit-Mathematik überschreitet, wird automatisch (und transparent) in ein Bignum konvertiert.
Sie finden alle wichtigen Details in PEP 0237 .
quelle
long
die Längen von s (in Ziffern) als vorzeichenlose 32-Bit-Ganzzahlen mit bis zu 4.294.967.295 Ziffern gespeichert, was bedeutet, dass sie leicht φ ** (4 * 10 ** 6) enthalten können ), was "nur" 832.951 Stellen ist. Da φ jedoch keine Ganzzahl ist, müssen Sie zur Berechnung der Zahl eine Dezimalzahl (Pythons Gleitkomma-Bignum) verwenden. Sie können das Ergebnislong
jedoch später speichern .long
ist der einzige ganzzahlige Typ in 3.0, aber er heißtint
. (Und der alteint
ist weg.)Python unterstützt natürlich beliebig große ganze Zahlen :
Beispiel:
Sie könnten sogar beispielsweise einen riesigen ganzzahligen Wert erhalten, fib (4000000).
Aber immer noch tut es nicht (bis jetzt) unterstützt eine beliebig große Schwimmer !!
Wenn Sie einen großen, großen Float benötigen, überprüfen Sie das Dezimalmodul. Es gibt Beispiele für die Verwendung in diesen Foren: OverflowError: (34, 'Ergebnis zu groß')
Eine weitere Referenz: http://docs.python.org/2/library/decimal.html
Sie können das gmpy-Modul sogar verwenden, wenn Sie eine Beschleunigung benötigen (was wahrscheinlich von Interesse ist): Umgang mit großen Zahlen im Code
Eine weitere Referenz: https://code.google.com/p/gmpy/
quelle
Sie könnten dies zum Spaß tun, aber ansonsten ist es keine gute Idee. Es würde nichts beschleunigen, was mir einfällt.
Das Erhalten der Karten in der Hand ist eine ganzzahlige Faktorisierungsoperation, die viel teurer ist als nur der Zugriff auf ein Array.
Das Hinzufügen von Karten wäre eine Multiplikation und das Entfernen der Kartenteilung, beides großer Mehrwortnummern, die teurer sind als das Hinzufügen oder Entfernen von Elementen aus Listen.
Der tatsächliche numerische Wert einer Hand sagt nichts aus. Sie müssen die Primzahlen berücksichtigen und die Pokerregeln befolgen, um zwei Hände zu vergleichen. h1 <h2 bedeutet für solche Hände nichts.
quelle
Python unterstützt natürlich beliebig große ganze Zahlen:
quelle
Der Python-Interpreter erledigt das für Sie, Sie müssen nur Ihre Operationen ausführen (+, -, *, /) und es funktioniert wie gewohnt.
Der
int
Wert ist unbegrenzt.Vorsicht bei der Division. Standardmäßig wird der Quotient in "Quotient" umgewandelt
float
, unterstützt jedochfloat
keine so großen Zahlen. Wenn Sie eine Fehlermeldung erhalten, die besagt,float
dass so große Zahlen nicht unterstützt werden, bedeutet dies, dass der Quotient zu groß ist, um darin gespeichert zu werden.float
Sie müssen die Etagenunterteilung (//
) verwenden.Auf diese Weise wird jede Dezimalstelle ignoriert, die nach dem Dezimalpunkt steht. Auf diese Weise wird das Ergebnis angezeigt
int
, sodass Sie ein Ergebnis mit einer großen Anzahl erhalten können.10//3
Ausgänge3
10//4
Ausgänge2
quelle