Die meisten zufälligen Zufallswähler im Internet leiden unter versteckten statistischen Verzerrungen – von der Verwendung des Standard-Math.random() mit Modulo-Arithmetik bis hin zu fehlerhaften Shuffling-Komparatoren. In diesem Leitfaden wird die Mathematik von Hardware-CSPRNG, Ablehnungsstichproben, gewichteten Wahrscheinlichkeiten und Störungen, die im Random Picker von Calculover verwendet werden, aufgeschlüsselt.

Warum Math.random() und Modulo Arithmetic Skew-Ergebnisse

in JavaScript ist Math.random() nicht kryptografisch sicher und es wird durch die Browserspezifikationen nicht garantiert, dass es eine gleichmäßige Verteilung auf allen Betriebssystemen hat. Schlimmer noch, viele Online-Picker nehmen eine zufällige Ganzzahl und verwenden den Modulo-Operator (randomUint % N). Da 232 (4.294.967.296) selten ein exaktes Vielfaches der Listengröße N ist, besteht eine etwas höhere Wahrscheinlichkeit, dass niedrigere Indizes ausgewählt werden – ein Effekt, der als modulo bekannt ist bias.

Calculover verwendet die Web-Crypto-API (crypto.getRandomValues), um hardwarebasierte 32-bit-Ganzzahlen zu zeichnen, kombiniert mit rejection-Sampling: jeder Rohwert, der darunter fällt Das unvollständige Restfenster [floor(2^32 / N) * N, 2^32) wird verworfen und neu gezeichnet. Dies garantiert eine mathematisch exakte, gleichwahrscheinliche Auswahl für jeden Kandidaten.

Gewichtete Ziehung und Auswahl ohne Zurücklegen

Bei einer gewichteten Verlosung besitzt jeder Eintrag i das Gewicht w_i. Bei einer einzelnen Ziehung beträgt seine Gewinnwahrscheinlichkeit w_i / W_total. Mehrere Gewinner ohne Wiederholung werden schrittweise gezogen: Sobald ein Kandidat gewinnt, werden seine Lose entfernt. Das Gesamtgewicht sinkt auf W_total - w_winner, und die Wahrscheinlichkeiten der verbleibenden Kandidaten steigen proportional.

Calculover setzt diese genaue Verringerung des gewichteten Los-Pools ohne Wiederholung um. Teilnehmer mit mehreren Losen erhalten so ihren vollen mathematischen Vorteil, ohne mehrfach gewinnen zu können.

Fisher-Yates-Shuffling vs. fehlerhafte Array-Sortierung

Ein häufiger Programmierfehler ist das Mischen mit array.sort(() => Math.random() - 0.5). Dieser Vergleich verletzt die Transitivität: Wenn A > B und B > C, muss auch A > C gelten. Das Ergebnis ist eine verzerrte Verteilung, in der manche Permutationen doppelt so wahrscheinlich sind wie andere.

Calculover verwendet die Durstenfeld-Variante des Fisher–Yates-Algorithmus. Von Index N-1 bis 1 wird jedes Element mit einem unverzerrt zufällig gewählten Element an seiner aktuellen oder einer früheren Position vertauscht. Alle N! Permutationen haben dadurch dieselbe Wahrscheinlichkeit 1 / N!.

Wichteln und die Mathematik von Permutationen ohne Fixpunkte

Beim Wichteln oder bei gegenseitigen Bewertungen darf niemand sich selbst zugeordnet werden. Eine solche Zuordnung ist eine Permutation ohne Fixpunkte, bei der \pi(i) \ne i gilt.

Calculover erzeugt einen unverzerrten Hamiltonkreis durch die zufällig gemischten Teilnehmer: Person 1 gibt an Person 2, Person 2 an Person 3, …, Person N an Person 1. Dieser geschlossene Kreis verhindert Selbstzuordnungen und bildet eine zusammenhängende Gruppe ohne getrennte Teilkreise.