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.

Weiterlesen