Wie die Ziehung funktioniert
Nicht einfach „Vertrauen Sie uns, es ist Zufall“. Hier ist die Methode.
Der Gewinner steht fest, bevor sich das Rad dreht
Bei jeder Drehung wird zuerst der Gewinner gezogen und anschließend die Animation darauf ausgerichtet. Diese Reihenfolge sorgt dafür, dass die Wischstärke das Ergebnis niemals beeinflussen kann und dass reduzierte Bewegung exakt dieselbe Ziehung ohne Animation ausführt, anstatt einen anderen Codepfad zu nutzen. Das bedeutet auch: Die Drehung, die Sie sehen, ist das Nachstellen einer bereits getroffenen Entscheidung – nur so können beide oben genannten Garantien gleichzeitig erfüllt werden.
Woher der Zufall kommt
Die Quelle ist der kryptografische Zufallsgenerator Ihres Browsers, crypto.getRandomValues, nicht Math.random. Math.random darf vorhersagbar sein und ist es bei manchen Browser-Engines auch; bei einer Verlosung spielt das eine entscheidende Rolle.
Warum wir manche Zahlen verwerfen
Eine 32-Bit-Zufallszahl durch Modulo-Division in „eine Zahl von 0 bis 11“ umzuwandeln, ist subtil unfair. 2³² lässt sich nicht ohne Rest durch 12 teilen, weshalb die ersten paar Optionen jeweils eine zusätzliche Chance erhalten. Bei einem Rad mit zwölf Segmenten ist diese Verzerrung winzig, aber sie ist real, bevorzugt immer dieselben Segmente und gleicht sich nie aus. Anstatt den Rest zu nehmen, verwerfen wir daher jede Ziehung, die in den ungleichmäßigen Restbereich fällt, und fordern eine neue an. Das kostet gelegentlich eine zusätzliche Ziehung, garantiert aber ein absolut gleichverteiltes Ergebnis.
const limit = Math.floor(2 ** 32 / max) * max;
let draw = crypto.getRandomValues(new Uint32Array(1))[0];
while (draw >= limit) {
draw = crypto.getRandomValues(new Uint32Array(1))[0];
}
return draw % max;Gewichtungen und warum die Segmentgrößen exakt übereinstimmen
Eine gewichtete Ziehung addiert alle Gewichtungen, ermittelt mit derselben Rejection-Sampling-Methode eine gleichverteilte Zahl unterhalb dieser Gesamtsumme und prüft, in welchen Eintrag diese Zahl fällt. Das Rad zeichnet jedes Segment dann exakt mit seinem Anteil am Kreis. Ein Rad, dessen Segmente gleich groß aussehen, während die Gewinnchancen ungleich sind, wäre genau die Täuschung, gegen die wir argumentieren – daher sind Fläche und Gewinnchance rein konstruktionsbedingt identisch.
Ihre Liste verlässt niemals Ihren Browser
Es gibt weder Benutzerkonten noch serverseitige Speicherung. Ihre Liste verbleibt in diesem Browser, und ein Freigabelink überträgt das Rad direkt in der URL selbst. Es wird absolut nichts über eine Ziehung an Stellen aufgezeichnet, die für uns einsehbar wären.
Selbst überprüfen
Die Ziehungslogik umfasst nur wenige Dutzend Zeilen, und jede obige Aussage ist durch einen Test abgedeckt, der fehlschlagen würde, wenn sie nicht mehr zutrifft – einschließlich eines Tests, der den Generator mit Zahlen füttert, die Modulo-Verzerrungen auslösen würden, und prüft, ob das Ergebnis gleichverteilt bleibt.
Ein Rad fasst bis zu 1000 Einträge, und die obige Methode ist für einen einzelnen Eintrag dieselbe wie für alle 1000.