Ist Ihr Zufallszahlengenerator fair? Praktische Audit-Checkliste

Wenn Sie eine Tombola veranstalten, Teams nach dem Zufallsprinzip auswählen oder Aufgaben per Lotterie verteilen, ist Fairness nicht optional – sie ist der springende Punkt. Aber „zufällig“ bedeutet nicht automatisch „fair“. Verborgene Vorurteile in Zufallszahlengeneratoren (RNGs) können die Ergebnisse auf unsichtbare Weise verzerren, es sei denn, Sie wissen, wo Sie suchen müssen.
Dieser Artikel enthält eine praktische Checkliste zur Prüfung jedes RNG auf Fairness, unabhängig davon, ob Sie unseren Zufallszahlengenerator verwenden oder Ihren eigenen erstellen.
Was Fairness für benutzerorientierte Ziehungen bedeutet
Ein fairer RNG liefert Ergebnisse, bei denen:
- Uniformity – jedes Ergebnis hat die gleiche Wahrscheinlichkeit (für gleichmäßige Verteilungen)
- Unabhängigkeit – jede Ziehung bleibt von vorherigen Ziehungen unberührt
- Unvorhersehbarkeit – kein Beobachter kann das nächste Ergebnis besser vorhersagen als der Zufall
- Überprüfbarkeit – Teilnehmer können bestätigen, dass der Prozess nicht manipuliert wurde
Das Fehlen eines dieser Punkte bricht das Vertrauen, selbst wenn die Ergebnisse „zufällig“ aussehen.
Häufige Quellen der Voreingenommenheit
Bad Seeds
Ein PRNG (Pseudozufallszahlengenerator) ist nur so unvorhersehbar wie sein Startwert. Häufige schlechte Samen:
- Aktueller Zeitstempel – auf die Millisekunde genau vorhersehbar; ein Angreifer, der ungefähr weiß, wann die Auslosung läuft, kann das Ergebnis reproduzieren
- Sequentielle Zähler – überhaupt nicht zufällig
- Benutzereingabe – kann von Teilnehmern manipuliert werden
Seed immer aus einer kryptografischen Quelle: crypto.getRandomValues() in Browsern, /dev/urandom unter Linux oder crypto.randomBytes() in Node.js.
Modulo Bias
Ein subtiler und häufiger Fehler: Verwendung des Modulo-Operators, um eine Zufallszahl auf einen Bereich zu reduzieren.
// BIASED – wenn der RNG-Bereich kein Vielfaches von 6 ist,
// Einige Ergebnisse sind etwas wahrscheinlicher
const roll = randomUint32() % 6; // RICHTIG – Ablehnungsstichprobe
Funktion fairDiceRoll() { const max = Math.floor(0xFFFFFFFF / 6) * 6; lass Wert; do { value = crypto.getRandomValues(new Uint32Array(1))[0]; } while (value >= max); Rückgabewert % 6;
}Bei einem 6-seitigen Würfel beträgt der Modulo-Bias mit einer 32-Bit-Ganzzahl nur ~0,00000009 %. Bei größeren Bereichen oder 8-Bit-Werten wird es jedoch von Bedeutung.
Versteckte Filter
Einige Ziehungssysteme schließen bestimmte Ergebnisse stillschweigend aus (z. B. indem sie „aktuelle Gewinner“ herausfiltern oder Ergebnisse erneut würfeln, die dem Betreiber nicht gefallen). Dies verstößt gegen die Fairness, selbst wenn der zugrunde liegende RNG perfekt ist. Dokumentieren und legen Sie alle Filterregeln vor der Ziehung offen.
Audit-Checkliste für Betreiber
- Entropiequelle – Stammt der RNG aus einer kryptografischen Quelle? (Nicht Math.random, keine Zeitstempel)
- Gleichmäßigkeitstest – Führen Sie mehr als 10.000 Proben durch und wenden Sie einen Chi-Quadrat-Test an. Der p-Wert sollte > 0,05 sein.
- Modulo-Bias – Verwendet der Code Ablehnungsstichproben oder eine unvoreingenommene Zuordnungsmethode?
- Independence – Sind sequentielle Ziehungen korreliert? Führen Sie einen Autokorrelationstest für große Stichprobenmengen durch
- Codeüberprüfung – Ist der Zeichencode Open Source oder überprüfbar? Versteckter Code kann Hintertüren enthalten
- Offenlegung filtern – Werden Ergebnisse gefiltert, neu gewürfelt oder ausgeschlossen? Dies muss offengelegt werden
- Timing – Kann der Bediener die Ergebnisse vor der Veröffentlichung sehen? Wenn ja, können sie ungünstige Ziehungen selektiv ausschließen
Transparenzmuster für öffentliche Gewinnspiele
Für Verlosungen mit hohen Einsätzen (Preise, Aufgaben, Auswahlen) verwenden Sie ein Commit-Reveal-Schema:
- Vor der Ziehung: Erzeuge einen zufälligen Startwert. Veröffentlichen Sie seinen SHA-256-Hash (die „Verpflichtung“) – z. B. in sozialen Medien oder in einem mit einem Zeitstempel versehenen Dokument
- Ziehung durchführen: Den Seed verwenden, um Ergebnisse mit einem deterministischen Algorithmus zu generieren
- Nach der Auslosung: Den Seed veröffentlichen. Jeder kann Folgendes überprüfen:
- Der Seed erzeugt den veröffentlichten Hash
- Der Seed + Algorithmus liefert die angekündigten Ergebnisse
Verwenden Sie unseren Hash-Generator, um den Commitment-Hash zu erstellen und zu überprüfen.
// Verpflichtungsphase
const Seed = crypto.randomBytes(32).toString('hex');
const commit = sha256(seed); // Veröffentliche dies vor der Auslosung // Draw-Phase
const result = deterministicDraw(Seed, Teilnehmer); // Reveal-Phase
// Seed veröffentlichen – jeder kann sha256(seed) === commit verifizieren Fairness gegenüber Benutzern kommunizieren
Vertrauen erfordert Transparenz. Bei der Durchführung öffentlicher Ziehungen:
- Geben Sie die verwendete RNG-Methode an (z. B. „Web Crypto API“)
- Den Zeichenalgorithmus veröffentlichen (sogar Pseudocode hilft)
- Commit-Reveal zur Überprüfbarkeit verwenden
- Zeichnungsprotokolle mit Zeitstempeln aufzeichnen und veröffentlichen
- Erlauben Sie unabhängigen Beobachtern, Ergebnisse zu überprüfen
FAQ
Ist Math.random gut genug?
Nein. Math.random() verwendet einen Pseudozufallszahlengenerator (PRNG), der nicht kryptografisch sicher ist. Seine Ausgabe kann vorhergesagt werden, wenn der interne Zustand bekannt ist. Für faire Ziehungen verwenden Sie crypto.getRandomValues() im Browser oder crypto.randomInt() in Node.js.
Wie kann ich nachweisen, dass eine Ziehung nicht manipuliert wurde?
Verwenden Sie ein Commit-Reveal-Schema: Veröffentlichen Sie vor der Ziehung einen Hash des zufälligen Startwerts (Commitment). Nach der Ziehung den Samen aufdecken. Jeder kann überprüfen, ob der Seed den veröffentlichten Hash und die angekündigten Ergebnisse produziert.
Wie viele Stichproben benötige ich für grundlegende Bias-Prüfungen?
Für eine einfache Gleichmäßigkeitsprüfung über N Ergebnisse hinweg benötigen Sie mindestens 100×N Stichproben (z. B. 1.000 Stichproben für eine Ziehung mit 10 Optionen). Wenden Sie einen Chi-Quadrat-Test an: Wenn der p-Wert über 0,05 liegt, ist die Verteilung einigermaßen gleichmäßig. Für ernsthafte Audits verwenden Sie mehr als 10.000 Proben.
Verwandte Tools und Artikel
- Zufallszahlengenerator – kryptografisch faire Zufallszahlen
- Hash Generator – Commitment-Hashes für überprüfbare Ziehungen erstellen
- Warum einen PIN-Generator verwenden? – sichere Zufalls-PINs
- Checkliste für digitale Hygiene – allgemeine Sicherheitspraktiken