Eine Solitaire-Partie muss unvorhersehbar sein, wenn du sie beginnst, und wiederholbar, wenn du sie später untersuchen willst. Beide Anforderungen passen zusammen, wenn das Mischen mit einem Seed beginnt: einer Zahl, die festlegt, wie das Deck angeordnet wird.
Cards4.net verwendet diesen Ansatz für seine Solitaire-Spiele. Mit dem Seed können wir eine Partie für eine Wiederholung, eine tägliche Herausforderung oder einen Fehlerbericht neu erzeugen. Zwischen den Modi unterscheidet sich, wie wir diese Zahl wählen, und diese Wahl ist wichtig, wenn man eine Partie als zufällig oder lösbar bezeichnet.
Von einer Zahl zu einem Deck
Unsere gemeinsame Karten-Engine übergibt den Seed an Erlangs
Pseudozufallsgenerator exsplus und ruft dann Elixirs Enum.shuffle auf,
um die Karten neu anzuordnen. Der Generator erzeugt eine wiederholbare Folge
von Werten; deshalb liefert uns dieselbe Eingabe dasselbe gemischte Deck.
Um eine Startposition neu zu erzeugen, brauchen wir außerdem das Spiel und seine Variante. Klondike, FreeCell und Spider legen ihre Karten unterschiedlich aus, und bei Spider verändert die Anzahl der Farben das Deck selbst. Ein Seed ist daher nur zusammen mit diesen Regeln und der Implementierung, die ihn auswertet, aussagekräftig.
Diese Wiederholbarkeit gilt für die aktuelle Implementierung. Eine Änderung an der anfänglichen Reihenfolge des Decks oder am Mischverfahren könnte die resultierende Partie verändern. Der Seed ist ein nützlicher Bezugspunkt für eine Partie, aber kein Versprechen, dass jede künftige Implementierung die Zahl identisch auswertet.
Woher der Seed kommt
Bei einer gewöhnlichen zufälligen Einzelspieler-Anfrage wählt der Server
mit Erlangs Modul rand eine Zahl zwischen null und 2^63 - 1. Diese Zahl
gibt er dann an die Spiel-Engine weiter. Die Auswahl berücksichtigt weder
die letzten Siege oder Niederlagen des Spielers noch seinen Kontoverlauf.
In der Engine gibt es außerdem eine Hilfsfunktion, die einen Seed aus
:crypto.strong_rand_bytes gewinnen kann. Dass es sie gibt, heißt nicht,
dass jede Spielanfrage sie verwendet: Der oben beschriebene gewöhnliche
Anfrageweg wählt seinen Seed über rand.
Diese Unterscheidung ist wichtig, weil weder der Generator der Anfrage noch
das mit dem Seed initialisierte Mischen über exsplus als kryptografisch
sicher bezeichnet werden sollte. Erlangs Dokumentation unterscheidet
ausdrücklich zwischen ihren
Pseudozufallsgeneratoren und Generatoren, die für Kryptografie geeignet sind.
Unsere Implementierung liefert uns reproduzierbare Solitaire-Partien; ein
kryptografisches Fairness-Protokoll bietet sie nicht.
Wie viele Anordnungen sind möglich?
Ein Deck aus 52 unterschiedlichen Karten hat 52! mögliche Reihenfolgen,
ungefähr 8.07 × 10^67. Diese Zahl zählt jede Wahl für die erste Karte,
multipliziert mit jeder verbleibenden Wahl für die zweite und so weiter.
Ein 63-Bit-Seed kann nur 2^63 Werte annehmen, ungefähr 9.22 × 10^18.
Da jeder Seed bei fester Implementierung ein Ergebnis erzeugt, kann er
höchstens so viele Reihenfolgen des Decks erreichen – möglicherweise
weniger, falls verschiedene Seeds dieselbe Reihenfolge ergeben. Wir können
nicht behaupten, jede mögliche Anordnung eines physischen Decks zu
erfassen.
Die kleinere Zahl ist immer noch groß, aber ihre Größe allein beweist nichts über die Qualität der Verteilung. Ebenso belegen ein paar ungünstige Partien nicht, dass das Mischen verzerrt ist. Eine aussagekräftige Untersuchung braucht aufgezeichnete Seeds, die maßgeblichen Spieleinstellungen und genug Ergebnisse, um eine bestimmte Behauptung zu prüfen.
Lösbare Partien stammen aus einem kleineren Pool
Der lösbare Modus fügt vor dem Mischen einen Auswahlschritt hinzu. Offline-Solver probieren Partien aus und speichern die Seeds, für die sie einen Gewinnweg finden. Wenn die entsprechende Bibliothek verfügbar ist, wählt der Server zufällig einen Eintrag aus diesem Pool.
Die resultierende Partie ist auf dieselbe Weise reproduzierbar wie eine gewöhnliche, stammt aber aus einer gefilterten Sammlung. Partien, die der Solver nicht zu Ende bringen konnte, fehlen, auch wenn es eine Lösung geben könnte. Der Pool ist endlich, daher kann dir eine Partie erneut begegnen.
Auch die täglichen Herausforderungen wählen aus diesen Bibliotheken und verwenden dabei Spiel, Variante und UTC-Datum, um einen Eintrag zu bestimmen. Alle, die an diesem Tag die Herausforderung in derselben Variante spielen, erhalten dieselbe Stellung. Die Wahl steht für den Tag fest, statt für jeden Spieler einzeln getroffen zu werden.
Microsoft-nummerierte FreeCell-Partien verwenden einen eigenen Kompatibilitätsalgorithmus. Ihre Nummern gehören zu diesem System; sie sind nicht mit unseren gewöhnlichen Misch-Seeds austauschbar. Der Leitfaden zu den Spielnummern erklärt, wie du eine bestimmte Partie öffnest.
Was du selbst prüfen kannst
Die Fairness-Seite kann Startpositionen für Klondike Turn 1 und Turn 3, FreeCell sowie die Ein-, Zwei- und Vierfarben-Varianten von Spider aus ihren öffentlichen Seeds rekonstruieren. Ein Vergleich des Ergebnisses mit der ursprünglichen Partie prüft, ob Seed und Spielfeld übereinstimmen.
Dieses Werkzeug verwendet unser Backend. Es stellt nicht unabhängig fest, wie der Seed gewählt wurde, beweist nicht, dass ein Auswahlverfahren unverzerrt war, und zeigt nicht, dass eine Partie gewinnbar ist. Das sind eigene Fragen.
Bei einer verdächtigen Partie oder einem Fehlerbericht solltest du Seed und Variante zusammen mit einer Beschreibung des Geschehens aufbewahren. Eine reproduzierbare Stellung gibt uns etwas, das wir untersuchen können. Ein Mischen fair zu nennen bringt wenig, wenn wir nicht auch erklären, was sich tatsächlich prüfen lässt.
FAQ
Kann ich eine Partie von Cards4.net reproduzieren?
Bei unterstützten Solitaire-Spielen ergeben derselbe Seed, dieselbe Variante und dieselbe Misch-Implementierung dieselbe Startposition. Die Fairness-Seite kann diese Position rekonstruieren.
Welchen Zufallsgenerator verwendet das Mischen?
Die gemeinsame Karten-Engine initialisiert Erlangs Pseudozufallsgenerator exsplus mit dem Seed und ruft Enum.shuffle auf. Gewöhnliche Einzelspieler-Anfragen wählen den 63-Bit-Seed ebenfalls mit einem Pseudozufallsgenerator.
Kann das Mischen jede mögliche Reihenfolge des Decks erzeugen?
Nein. Eine feste Implementierung mit einem 63-Bit-Seed kann höchstens 2^63 verschiedene Ergebnisse liefern, weit weniger als die 52! Anordnungen eines Standarddecks.
Beweist die Fairness-Seite, dass die Seed-Auswahl unverzerrt ist?
Nein. Sie prüft, dass ein Seed eine Startposition reproduziert. Da sie unser Backend verwendet, ist sie weder eine unabhängige Prüfung noch ein Beweis dafür, wie der Seed ausgewählt wurde.