Das Rad weiß es bereits
Warum der Gewinner gezogen wird, bevor die Animation startet – und welchen Vorteil das bringt.
Klicken Sie auf Drehen und das Rad dreht sich zehn Sekunden lang. Es wirkt, als fiele die Entscheidung irgendwo in diesen zehn Sekunden – beim Verlangsamen, in der letzten halben Umdrehung oder daran, ob der Zeiger gerade noch eine Trennlinie überschreitet.
Dem ist nicht so. Der Gewinner wird zuerst gezogen, innerhalb weniger Mikrosekunden, und die Animation wird anschließend exakt darauf ausgerichtet.
Warum diese Reihenfolge
Die naheliegende Alternative wäre, das Rad einfach zu drehen und abzulesen, wo es stehen bleibt. Das klingt fairer – niemand hat entschieden, sondern die Physik –, lässt sich aber weitaus schwerer verteidigen. Denn dadurch wird jede Frage zur Fairness zu einer Frage über die Animation.
Kann man durch kräftigeres Wischen das Ergebnis verändern? Verzerrt ein Klick während des Drehens das Ergebnis, um die Animation vorzeitig zu stoppen? Was passiert bei Personen, die mit aktiviertem prefers-reduced-motion surfen und die Animation überhaupt nicht sehen?
Wird zuerst gezogen, lautet die Antwort auf alle drei Fragen gleich: Nein, denn die Ziehung hat bereits stattgefunden. Ein Wischen verlängert lediglich die Drehung. Ein vorzeitiger Klick verkürzt den Weg. Reduzierte Bewegung überspringt den Weg komplett und zeigt das Ergebnis sofort an. Drei verschiedene Abläufe in einem einzigen Codepfad, statt drei Verzweigungen, die jeweils separat begründet werden müssten.
Wie die Ziehung abläuft
Die Entropie stammt aus crypto.getRandomValues – dem kryptografischen Zufallsgenerator des Browsers – und niemals aus Math.random.
Daraus eine gleichmäßige Verteilung zu erhalten, erfordert einen zusätzlichen Schritt. Das naheliegende draw % count führt zu einer Verzerrung, sobald count kein exakter Teiler von 2³² ist: Die ersten Einträge erhalten dann jeweils eine zusätzliche Chance von vier Milliarden. Das ist minimal, aber es ist ein ungleicher Vorteil – und ein Rad, das Fairness verspricht, darf keinen haben. Ziehungen, die in den verbleibenden Restbereich fallen, werden daher verworfen und neu gezogen.
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;
Das kostet gelegentlich eine zusätzliche Ziehung, garantiert dafür aber ein mathematisch exakt gleichverteiltes Ergebnis. Derselbe Code steht auch auf der Fairness-Seite, wo er der tatsächliche Text ist und nicht bloß ein Schaubild.
Gewichtungen sind Wahrscheinlichkeiten, keine Bevorzugungen
Gibt man einem Eintrag eine Gewichtung von 3, erhält er drei Anteile an der Ziehung statt einem. Das Rad stellt ihn als breiteren Sektor dar, und die Liste zeigt den genauen Prozentsatz an, den diese Gewichtung ausmacht, damit niemand von Hand rechnen muss.
Zwei Einträge mit demselben Text bleiben zwei separate Einträge. Jeder behält seine eigene Chance, und die Liste gibt an, wie viele Duplikate gefunden wurden, anstatt sie stillschweigend zusammenzuführen – die Gewinnchance von jemandem ungefragt zu halbieren, wäre eine Hilfsbereitschaft, die niemand gebrauchen kann.
Wozu die Animation dennoch dient
Eine gezielte Animation ist keine Täuschung. Das Rad dreht sich tatsächlich zu dem Sektor, auf dem es landet, das Ticken ist exakt auf die passierenden Trennlinien abgestimmt, und das Beinahe-Treffer-Zögern – sofern aktiviert – verweilt kurz auf einem Nachbarn des Gewinners statt auf einem zufälligen Sektor, bevor es auf dem Eintrag zum Stehen kommt, der bereits vor Beginn feststand.
Die Spannung ist echt. Das Ergebnis stand nur schon vorher fest.