Wie eine Auslosung funktioniert — ein durchgearbeitetes Beispiel

Gehen Sie eine real nachgebildete Auslosung von Anfang bis Ende durch: 1.000 berechtigte Kommentare, 3 Gewinner, 9 Reserven. Kein Fachjargon, kein Handwedeln.

Das Szenario

Stellen Sie sich vor, der Wettbewerb ist vorbei. Kommentare wurden abgerufen, die Filter des Wettbewerbs wurden angewendet, und 1.000 Einträge sind teilnahmeberechtigt. Der Preis wird an 3 Gewinner vergeben, mit 9 Reserven für den Fall, dass einer der Gewinner nicht erreichbar ist. Hier ist die Einzelwahrscheinlichkeit — identisch für jeden der 1.000 berechtigten Kommentare, unabhängig davon, wann er gepostet wurde oder wie lang der Name des Kommentators ist.

Ergebnis Chance für einen einzelnen Eintrag
Als Hauptgewinner ausgelost (Plätze 1–3) 3 von 1.000 — 0,30 %
Als Reserve ausgelost (Plätze 4–12) 9 von 1.000 — 0,90 %
In irgendeinen Gewinnerplatz ausgelost 12 von 1.000 — 1,20 %

Daran ändert sich nichts, wenn der Wettbewerb 444 oder 444.444 Kommentare hat. Der Algorithmus ist identisch. Nur der Nenner ändert sich.

Schritt 1 — Einträge sammeln und filtern

Die App ruft jeden Kommentar des Facebook- oder Instagram-Beitrags ab, den Sie verknüpft haben, und wendet dann die Filter des Wettbewerbs an — Duplikate, gesperrte Wörter, Kontoaltersregeln, was auch immer konfiguriert wurde. Was übrig bleibt, ist der berechtigte Satz. In unserem Szenario sind das 1.000 Kommentare. Jeder hat eine Datenbankzeile mit einer eindeutigen numerischen ID; diese 1.000 IDs sind es, mit denen der Rest der Auslosung arbeitet.

Schritt 2 — In kanonische Reihenfolge sortieren

Bevor etwas Zufälliges passiert, sortiert die App die 1.000 IDs in streng aufsteigender numerischer Reihenfolge — 17, 142, 203, 1058, 9941, … — und verwirft die Reihenfolge, in der sie eingegangen sind. Warum? Weil Facebook Kommentare je nach Seitennummerierung, Tageszeit oder Backend-Änderungen in unterschiedlichen Reihenfolgen zurückgeben kann. Wenn die Auslosung die Reihenfolge von Facebook verwenden würde, könnten zwei erneute Abrufe aus demselben Zufalls-Seed unterschiedliche Gewinner erzeugen. Das vorherige Sortieren bindet die Eingabe an eine kanonische Liste, sodass der Seed allein das Ergebnis bestimmt.

Schritt 3 — Eingabeliste mit einem SHA-256-Hash sichern

Die sortierte Liste wird in SHA-256 eingespeist — eine kryptografische Hash-Funktion — und erzeugt einen 64-stelligen Fingerabdruck. Der Fingerabdruck wird zusammen mit der vollständigen Liste selbst im Wettbewerbsdatensatz gespeichert. Von diesem Moment an kann jeder, der den Wettbewerb prüft, bestätigen, dass die berechtigte Liste nicht verändert wurde: Hashen Sie die veröffentlichte Liste erneut, vergleichen Sie sie mit dem gespeicherten Fingerabdruck, und eine einzige veränderte ID ergibt einen völlig anderen Hash. Es gibt keine Möglichkeit, nach diesem Schritt einen Kommentar still hinzuzufügen oder zu entfernen, ohne dass es sichtbar wäre.

Schritt 4 — Einen 256-Bit-Zufalls-Seed generieren

Die App fordert die kryptografische Zufallsquelle des Betriebssystems (SecureRandom.hex(32)) nach 32 Bytes unvorhersehbarer Zufälligkeit an und speichert das Ergebnis als 64-stellige Hexadezimalzeichenfolge — zum Beispiel a3f1…ce. 256 Bits bedeuten 2²⁵⁶ ≈ 10⁷⁷ mögliche Seeds. Zum Vergleich: Das beobachtbare Universum enthält etwa 10⁸⁰ Atome. Niemand — nicht der Wettbewerbsersteller, nicht der Betreiber, nicht ein Angreifer von außen — kann diesen Seed vor seiner Erzeugung vorhersagen oder erraten.

Schritt 5 — Die 1.000 IDs mischen, dann die ersten 12 nehmen

Der Seed initialisiert eine deterministische Misch-Engine, die dann einen Fisher-Yates-Shuffle auf den 1.000 sortierten IDs durchführt. Fisher-Yates ist der Standard-Fairmisch-Algorithmus — jeder der 1.000 Einträge hat die gleiche Chance, in jeder Position zu landen. Nach dem Mischen nimmt die App die ersten 12 Einträge vom Stapel. Das ist der gesamte Auswahlschritt: Mischen, 12 entnehmen.

Schritt 6 — Positionen zuweisen

Die 12 ausgewählten Einträge werden der Reihe nach durchgegangen. Die ersten drei werden zu Gewinnern 1, 2 und 3, und die nächsten neun werden zu Reserven 1 bis 9. Die verbleibenden 988 berechtigten Einträge werden als nicht ausgewählt erfasst. Kommentare, die zuvor herausgefiltert wurden, werden mit dem spezifischen Grund markiert, warum sie nicht qualifiziert waren.

Schritt 7 — Alles veröffentlichen

Abschließend speichert die App fünf Beweismittel im Wettbewerbsdatensatz — alle öffentlich lesbar. Ohne sie wäre das Ergebnis eine Black Box. Mit ihnen kann jeder die gesamte Auslosung zu Hause reproduzieren und bestätigen, dass die veröffentlichten Gewinner die einzigen Gewinner sind, die der Seed hätte erzeugen können.

Was bei jeder Auslosung veröffentlicht wird

Jedes davon wird im Wettbewerb gespeichert und über die öffentlichen Überprüfungsseiten zugänglich gemacht. Zusammen machen sie die Auslosung vollständig reproduzierbar — gleiche Eingaben, gleiche Ausgaben, immer.

  • Der 256-Bit-Zufalls-Seed — die 64-stellige Hex-Zeichenfolge aus Schritt 4.
  • Die sortierte Liste der berechtigten IDs — alle 1.000 IDs aus Schritt 2, in kanonischer Reihenfolge.
  • Der SHA-256-Fingerabdruck der IDs — der 64-stellige Hash aus Schritt 3. Bestätigt, dass die veröffentlichte Liste nicht manipuliert wurde.
  • Die Algorithmusversion — derzeit v1. Fixiert den genauen Auswahlalgorithmus, sodass zukünftige Verbesserungen alte Ergebnisse nie rückwirkend ändern.
  • Die Ruby-Version — fixiert die Sprachlaufzeit, da die genaue Reihenfolge des Shuffles davon abhängt.

Die Mathematik selbst nachrechnen — in fünf Zeilen

Wenn Sie Ruby installiert haben (es wird mit macOS und den meisten Linux-Distributionen geliefert), können Sie die genaue Auslosung zu Hause reproduzieren. Jeder Wettbewerb veröffentlicht seine eigene eligible-ids.txt auf seiner Überprüfungsseite (URL-Muster: /results/<token>/verify) — der Überprüfungsleitfaden führt Schritt für Schritt durch den Download. Kopieren Sie den veröffentlichten Seed und fügen Sie folgendes in irb ein:

require "digest"
seed = "PASTE_THE_PUBLISHED_SEED_HERE"
ids  = File.read("eligible-ids.txt").split("\n").map(&:to_i).sort

# (1) Sanity check the input: must equal the published SHA-256.
Digest::SHA256.hexdigest(ids.join("\n"))

# (2) Re-run the shuffle. First 3 items are winners 1..3 (in order);
#     the next 9 items are reserves 1..9.
ids.shuffle(random: Random.new(seed.to_i(16))).first(12)

Die 12 IDs kommen in genau derselben Reihenfolge heraus, die der Wettbewerb veröffentlicht hat. Drei Gewinner, neun Reserven, bit-für-bit identisch. Das macht eine Pick a Winner-Auslosung überprüfbar statt nur versprochen — die Mathematik erledigt die Arbeit, nicht das Wort des Betreibers.

Warum das schwer zu manipulieren ist

  • Der Seed ist nicht erratbar. 2²⁵⁶ Möglichkeiten, erst generiert, nachdem die berechtigte Liste festgelegt wurde. Niemand kann vorausberechnen, welche IDs der Seed bevorzugen würde, weil der Seed bis zum Moment der Auslosung nicht existiert.
  • Die Eingabe ist gesperrt. Der SHA-256-Fingerabdruck bedeutet, dass Sie nach dem Sehen des Seeds keinen Kommentar eines Freundes still hinzufügen können — der Fingerabdruck würde sich ändern und die Auslosung ließe sich nicht mehr reproduzieren.
  • Der Shuffle ist mechanisch. Sobald der Seed und die sortierte Liste existieren, stehen die Gewinner fest. Keine menschliche Entscheidung steht dazwischen. Jede nachträgliche Änderung würde als Nichtübereinstimmung auffallen, sobald jemand die Mathematik nachrechnet.
  • Der Nachweis ist öffentlich. Seed, Liste, Hash, Algorithmusversion, Ruby-Version — alle fünf werden veröffentlicht. Es gibt keinen privaten Teil der Auslosung, den der Betreiber ändern könnte, ohne dass es für alle sichtbar wäre.