Zufallszahlengenerator

Erzeugen Sie eine oder mehrere Zufallszahlen in einem beliebigen Bereich, mit oder ohne Wiederholungen — mit kryptografischer Zufälligkeit.

1.446 Aufrufe

Wie die Zahlen tatsächlich erzeugt werden

Nicht jede „Zufälligkeit" ist gleich. Math.random(), in jedem Browser verfügbar, ist ein schneller Pseudozufallsgenerator — im Kern deterministisch und im Prinzip vorhersagbar, wenn jemand seinen internen Zustand kennt, was ihn für alles Sicherheitsrelevante wie Ziehungen mit echten Einsätzen ungeeignet macht. Dieses Tool verwendet stattdessen crypto.getRandomValues(), den kryptografisch sicheren Zufallsgenerator im Browser, der aus den Entropiequellen des Betriebssystems schöpft und nicht einmal im Prinzip vorhersagbar ist.

Eine sichere Zufallsquelle zu haben löst jedoch nur die halbe Aufgabe. Einen Zufallswert naiv auf einen bestimmten Bereich (etwa 1-100) abzubilden — durch zufall % 100 — führt zu einem subtilen, aber realen Modulo-Bias: Da der rohe Ausgabebereich des Generators normalerweise kein exaktes Vielfaches von 100 ist, werden manche Reste minimal wahrscheinlicher als andere. Der Bias ist klein, aber real, und er summiert sich über viele Ziehungen — genau die Art von Sache, die in einer angeblich fairen Verlosung nicht existieren sollte.

Die Lösung ist Rejection Sampling (Ablehnungsstichprobe): Statt jeden Rohwert per Modulo zwangsweise in den Bereich zu pressen, werden außerhalb des Bereichs liegende Rohwerte verworfen und ein neuer gezogen, bis einer sauber in ein exaktes Vielfaches des Zielbereichs passt. Das garantiert eine wirklich gleichmäßige Verteilung — jede Zahl im Bereich hat exakt die gleiche Wahrscheinlichkeit — auf Kosten gelegentlich ein oder zwei zusätzlicher Ziehungen, was bei den beteiligten Geschwindigkeiten nicht wahrnehmbar ist.

Wählen Sie ein Minimum, ein Maximum und wie viele Zahlen benötigt werden; aktivieren Sie eindeutig, um Wiederholungen zu vermeiden — das brauchen Verlosungen, Preisziehungen, Stichproben und Spiele, bei denen derselbe Eintrag nicht zweimal gewinnen soll. Alles läuft auf dem lokalen Gerät — keine Zahl wird irgendwohin übertragen oder gespeichert, und ein Neuladen der Seite erzeugt eine völlig neue Ziehung.

Wissenswertes

  • Modulo-Bias ist bei einer Handvoll Ziehungen unsichtbar, wird aber über Tausende statistisch nachweisbar — Rejection Sampling beseitigt ihn vollständig, statt ihn nur zu verkleinern.
  • Dass crypto.getRandomValues() „kryptografisch sicher" ist, bedeutet, dass seine Ausgabe selbst von jemandem, der frühere Ausgaben gesehen hat, nicht vorhergesagt werden kann — eine Eigenschaft, die Math.random() ausdrücklich nicht hat und nie haben sollte.
  • Der Bereich schließt beide Enden ein: eine 1-10-Ziehung kann sowohl 1 als auch 10 ergeben, nicht nur die Werte streng dazwischen.
  • Für eine überprüfbare Verlosung nummerieren Sie die Teilnehmer von 1 bis N, stellen Sie den Bereich entsprechend ein, aktivieren Sie eindeutig, und machen Sie einen Screenshot des Ergebnisses, da nach der Ziehung nichts serverseitig gespeichert wird.

Häufig gestellte Fragen

Sind die Zahlen wirklich zufällig oder nur „zufällig genug"?

Sie stammen aus crypto.getRandomValues(), das auf die kryptografische Entropiequelle des Betriebssystems zugreift - unvorhersehbar im Prinzip, nicht nur in der Praxis, im Gegensatz zum einfachen Math.random(), das die meisten beiläufigen Zufallszahlen-Skripte verwenden.

Was ist Modulo-Bias und hat dieses Tool ihn?

Einen Zufallswert naiv mit zufall % N auf einen Bereich abzubilden, bevorzugt manche Zahlen leicht gegenüber anderen, weil der rohe Bereich des Generators normalerweise kein exaktes Vielfaches von N ist. Dieses Tool vermeidet das mit Rejection Sampling: außerhalb des Bereichs liegende Rohwerte werden verworfen und neu gezogen, bis ein gleichmäßiges Ergebnis garantiert ist.

Was ist Rejection Sampling, einfach erklärt?

Statt jeden Zufallswert mit einer Modulo-Operation zwangsweise in einen Bereich zu pressen, werden Werte, die einen Bias verursachen würden, einfach verworfen und ein neuer gezogen - wiederholt, bis ein Wert erscheint, der perfekt gleichmäßig in den Bereich passt. Die Kosten sind gelegentlich eine zusätzliche Ziehung; der Nutzen ist ein wirklich gleichmäßiges Ergebnis.

Kann ich das für eine Preisziehung verwenden?

Ja. Nummerieren Sie die Teilnehmer von 1 bis N, stellen Sie den Bereich entsprechend ein, aktivieren Sie eindeutig, und erzeugen Sie so viele Gewinner wie nötig. Machen Sie einen Screenshot für Ihre Unterlagen, da nach der Ziehung nichts gespeichert wird.

Sind Minimum und Maximum beide im Bereich enthalten?

Ja - der Bereich ist an beiden Enden inklusiv. Eine 1-10-Ziehung kann sowohl 1 als auch 10 ergeben, genau wie beim Ziehen nummerierter Zettel aus einem Hut.

Kommentare

Noch keine Kommentare — schreiben Sie den ersten!

Ähnliche Tools