Gewinnspiel fair auslosen und die Auslosung nachvollziehbar machen
Um fair auszulosen, brauchst du einen Generator für sicherheitsrelevante Zwecke, jeder Teilnehmer sollte die gleiche Chance haben, und hinterher muss sich das Ergebnis überprüfen lassen. Die meiste Unfairness bei einem einfachen Zufallsgenerator entsteht an einer von zwei Stellen: einer schwachen Zufallsquelle oder einem kleinen Rechenfehler, der Modulo-Bias heißt. Beides lässt sich beheben. Eine veröffentlichte Teilnehmerliste und ein Protokoll der Auslosung sind der beste Beweis, dass niemand den Gewinner bestimmt hat.
ZufallsauswahlFair einen Gewinner auslosenKostenlos loslegenEchter und Pseudo-Zufall
Eine echte Zufallsquelle bezieht ihre Unvorhersagbarkeit aus einem physikalischen Prozess, etwa elektronischem Rauschen. Ein Pseudo-Zufallsgenerator ist dagegen eine Formel. Er startet mit einem Startwert (Seed), führt deterministische Rechenschritte aus und erzeugt eine Folge, die zufällig aussieht. Die Folge ist vollständig durch den Startwert bestimmt. Wer Startwert und Formel kennt, kann jede Zahl vorhersagen.
Die meiste Software nutzt Pseudo-Zufallsgeneratoren, und das ist für das Mischen einer Playlist oder das Zufallsmuster eines Spiellevels völlig in Ordnung. Bei einer Verlosung, bei der es etwas zu gewinnen gibt, kommt es darauf an, ob jemand das Ergebnis vorhersagen oder beeinflussen könnte. Ein Generator, der schnell, aber vorhersagbar ist, ist hier das falsche Werkzeug.
Den kryptografischen Generator des Browsers nutzen
In JavaScript ist Math.random() ein schneller Pseudo-Zufallsgenerator. Laut seiner Dokumentation ist er nicht für Kryptografie gedacht, und eine Gewinnauslosung ist eine sicherheitsrelevante Entscheidung. Die Web-Crypto-Funktion crypto.getRandomValues() füllt ein Feld mit Werten aus der kryptografischen Zufallsquelle des Betriebssystems. Diese solltest du verwenden. Der Zufallsgenerator nutzt sie bei jeder Auswahl, auch bei Münzwurf und Würfel. Ein Werkzeug, das nicht sagt, was es verwendet, ist schwerer zu vertrauen, also frag nach, bevor du dich darauf verlässt.
Modulo-Bias, an einem Beispiel
Angenommen, deine Quelle liefert ein zufälliges Byte, also eine ganze Zahl von 0 bis 255, und du willst einen von drei Teilnehmern ziehen. Der einfache Weg ist, den Rest bei der Division durch 3 zu nehmen. Das wirkt fair, aber 256 lässt sich nicht gleichmäßig in Dreiergruppen teilen.
- Die Werte 0, 3, 6 und so weiter bis 255 ergeben den Rest 0. Davon gibt es 86.
- Werte mit Rest 1 gibt es 85, und Werte mit Rest 2 ebenfalls 85.
Der Eintrag 0 kommt also 86-mal von 256 vor, etwa 33,6 %, während die Einträge 1 und 2 jeweils 85-mal vorkommen, etwa 33,2 %. Der Unterschied ist klein, aber real, und er wächst, sobald die Zahl der Teilnehmer im Verhältnis zum Wertebereich der Quelle groß wird.
Die Lösung heißt Rejection Sampling. Du ziehst einen Wert, und liegt er im ungleichmäßigen Restbereich, ziehst du erneut. Im Byte-Beispiel verwirfst du die 255 und akzeptierst nur 0 bis 254, denn das lässt sich gleichmäßig durch 3 teilen. Bei einer 32-Bit-Zufallszahl ist der Restbereich etwa einer von 4,3 Milliarden Werten, der Bias ist für eine Verlosung also vernachlässigbar. Trotzdem sollte ein sorgfältiger Generator das richtig behandeln, denn derselbe Fehler wird schlimmer, je kleiner der Wertebereich ist.
Auslosungen ohne Doppelziehungen
Brauchst du mehrere Gewinner, kann das dreimalige Ziehen eines Zufallsindex denselben Teilnehmer zweimal treffen. Zwei saubere Methoden vermeiden das:
- Entferne jeden Gewinner aus der Liste und ziehe dann aus dem Rest.
- Mische die gesamte Liste einmal mit dem Fisher-Yates-Verfahren und nimm die Gewinner von oben.
Fisher-Yates geht die Liste vom Ende her durch, tauscht jede Position mit einer zufällig gewählten Position auf oder vor ihr und erzeugt bei fairen Zufallswahlen jede Reihenfolge mit gleicher Wahrscheinlichkeit. Das Verfahren ist kurz, gut erforscht und lässt sich Teilnehmern leicht erklären. Die Optionen Gewinner aus der Liste entfernen und Keine Wiederholungen des Zufallsgenerators decken beide Methoden ab.
Die Auslosung überprüfbar machen
Eine faire Auslosung ist eine, die jeder nachprüfen kann. Vor der Auslosung:
- Veröffentliche die Teilnehmer als nummerierte Liste, zusammen mit den Teilnahmebedingungen.
- Veröffentliche einen SHA-256-Fingerabdruck dieser Liste. Jedes SHA-256-Werkzeug kann ihn erzeugen, zum Beispiel der Hash-Generator. Ein Fingerabdruck ändert sich vollständig, sobald sich auch nur ein Eintrag ändert, sodass die Liste nicht unbemerkt nachträglich verändert werden kann. Dieselbe Prüfung bestätigt Downloads; wie das im Einzelnen geht, zeigt wie du die SHA-256-Prüfsumme einer Download-Datei prüfst.
Während und nach der Auslosung:
- Nimm den Bildschirm auf, vom Start des Zufallsgenerators bis zum angezeigten Ergebnis.
- Veröffentliche die endgültige Liste mit der Gewinnernummer, damit andere den Fingerabdruck nachrechnen und bestätigen können, dass nichts verändert wurde.
- Erkläre, wie der Gewinner ermittelt wurde, zum Beispiel: „ausgelost mit einem browserbasierten Zufallsgenerator, der die kryptografische Zufallsquelle des Betriebssystems nutzt“.
Die Regeln für Gewinnspiele unterscheiden sich je nach Plattform, und Verlosungen können rechtliche Anforderungen mit sich bringen, die davon abhängen, wo du wohnst. Prüfe vor einer Verlosung die Aktionsbedingungen der Plattform und die für dich geltenden Gesetze. Das ist allgemeine Orientierung und keine Rechtsberatung. Wenn du so weit bist, ziehst du den Gewinner mit dem Zufallsgenerator.
So geht's mit fixmint
- Wähle Namen und füge die Teilnehmer unter Namen, einer pro Zeile ein.
- Stelle unter Gewinner die Anzahl der Preise ein. Setze den Haken bei Gewinner aus der Liste entfernen, damit niemand zweimal gewinnen kann.
- Für eine Nummern-Auslosung wähle Zahl, stelle Kleinste und Größte ein und setze den Haken bei Keine Wiederholungen, wenn jede Nummer nur einmal gewinnen darf.
- Drücke Gewinner ziehen, während deine Bildschirmaufnahme von Anfang an läuft.
- Veröffentliche die nummerierten Teilnehmer, den SHA-256-Fingerabdruck, den gewinnenden Eintrag und wie der Zufallsgenerator verwendet wurde.
Kurze Antworten
Ist Math.random() für ein Gewinnspiel in Ordnung?
Für Spiele und Mischen ja, aber nicht für eine Auslosung, die andere nachprüfen werden, weil sich seine Ausgabe vorhersagen lässt. Nutze eine kryptografische Quelle.
Warum nicht einfach eine Zufallszahl modulo der Anzahl der Teilnehmer nehmen?
Wenn sich der Wertebereich nicht gleichmäßig teilen lässt, ist der Rest ungleichmäßig verteilt, und manche Teilnehmer haben dadurch eine etwas höhere Chance. Rejection Sampling beseitigt diesen Bias.
Kann ich aus einer Auslosung mehrere Gewinner ziehen?
Ja. Entferne nach jeder Ziehung den Gewinner, bevor du den nächsten ziehst, oder mische einmal und nimm die oberen Einträge. In beiden Fällen kann kein Teilnehmer zweimal gewinnen.
Mit KI-Unterstützung aus dem Englisches Original übersetzt.
Kommentare
Noch keine Kommentare. Schreib den ersten.


