Salta al contenuto principale
Tutti gli articoli
Come funziona

La ruota lo sa già

Perché il vincitore viene estratto prima dell'inizio dell'animazione e cosa garantisce questo approccio.

Premi Gira e la ruota gira per dieci secondi. Sembra che il risultato venga deciso proprio durante quei dieci secondi: nella decelerazione, nell'ultimo mezzo giro, nel fatto che l'indicatore superi o meno un divisore.

Non è così. Il vincitore viene estratto per primo, in pochi microsecondi, e l'animazione viene poi mirata su di esso.

Perché questo ordine

L'alternativa ovvia è far girare la ruota e vedere dove si ferma. Sembra più equo — nessuno ha scelto, lo ha fatto la fisica — ma è la cosa più difficile da difendere, perché trasforma ogni dubbio sulla trasparenza in un dubbio sull'animazione.

Si può dare un tocco più forte per cambiare l'esito? Cliccare a metà giro per interromperlo prima falsa il risultato? Cosa succede a chi naviga con prefers-reduced-motion attivo e non vede affatto l'animazione?

Estraendo prima, la risposta a tutte e tre le domande è la stessa: no, perché l'estrazione è già avvenuta. Il tocco forte aggiunge giri extra. Il clic anticipato accorcia il percorso. Il movimento ridotto salta l'intero tragitto e annuncia subito il risultato. Tre percorsi diversi attraverso lo stesso pezzo di codice, invece di tre rami da giustificare separatamente.

Cosa esegue l'estrazione

L'entropia proviene da crypto.getRandomValues — il generatore crittografico proprio del browser — e mai da Math.random.

Ottenere un numero uniforme richiede un passaggio in più rispetto a quanto possa sembrare. L'operazione ovvia draw % count risulta sbilanciata ogni volta che count non divide 2³² in modo esatto: le prime voci ottengono una possibilità in più su quattro miliardi. Piccola, certo, ma è una disparità, e una ruota che si definisce equa non dovrebbe averne. Per questo motivo, le estrazioni che cadono nella coda rimanente vengono scartate e se ne effettua un'altra.

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;

Ciò comporta occasionalmente un'estrazione supplementare, garantendo un risultato esattamente uniforme. Lo stesso codice è presente nella pagina sulla trasparenza, dove costituisce il testo effettivo e non una mera illustrazione.

I pesi sono probabilità, non favoriti

Assegna a una voce un peso di 3 e otterrà tre quote di estrazione invece di una. La ruota la disegna come un settore più ampio e l'elenco mostra la percentuale effettiva corrispondente a quel peso, così che nessuno debba fare divisioni a mano.

Due voci con lo stesso testo restano due voci distinte. Ognuna mantiene la propria probabilità e l'elenco indica quante ripetizioni ha trovato anziché unirle silenziosamente: dimezzare le probabilità di qualcuno senza avvisare è il tipo di favore che nessuno ha chiesto.

A cosa serve ancora l'animazione

Un'animazione mirata non è un'animazione finta. La ruota compie davvero il percorso fino al settore di destinazione, i ticchettii sono sincronizzati con i divisori oltrepassati e l'esitazione da vittoria sfiorata — quando attivata — si sofferma su un vicino del vincitore anziché su un settore casuale, per poi proseguire fino alla voce estratta prima che tutto iniziasse.

La suspense è reale. Il risultato è solo più vecchio di quanto sembri.