Saltar al contenido principal
Todas las publicaciones
Cómo funciona

La ruleta ya lo sabe

Por qué el ganador se sortea antes de que empiece la animación y qué ventajas ofrece.

Pulsa Girar y la ruleta girará durante diez segundos. Parece que el resultado se decide en algún momento de esos diez segundos: en la desaceleración, en la última media vuelta o en si el puntero logra superar una división más.

No es así. El ganador se sortea primero, en unos pocos microsegundos, y luego la animación se dirige hacia él.

Por qué este orden

La alternativa obvia es hacer girar la ruleta y leer dónde se detiene. Suena más justo (nadie eligió nada, lo hizo la física), pero es lo más difícil de defender, porque convierte cada pregunta sobre la imparcialidad en una pregunta sobre la animación.

¿Puedes deslizar con más fuerza y cambiar el resultado? ¿Hacer clic a mitad del giro para detenerla antes altera las probabilidades? ¿Qué ocurre con alguien que navega con prefers-reduced-motion activado y nunca llega a ver la animación?

Si sorteas primero, las tres preguntas tienen la misma respuesta: no, porque el sorteo ya tuvo lugar. El impulso añade vueltas adicionales. El clic temprano acorta el recorrido. La reducción de movimiento omite el recorrido por completo y anuncia el resultado de inmediato. Tres caminos distintos a través de un único bloque de código, en lugar de tres ramas que tendrían que justificarse por separado.

Qué realiza el sorteo

La entropía proviene de crypto.getRandomValues (el propio generador criptográfico del navegador) y nunca de Math.random.

Obtener un número uniforme a partir de él requiere un paso más de lo que parece a simple vista. El cálculo directo draw % count está sesgado siempre que count no divida a 2³² de forma exacta: las primeras entradas reciben una probabilidad extra entre cuatro mil millones. Es pequeña, pero inclina la balanza, y una ruleta que afirma ser justa no debería tener ese sesgo. Por tanto, los sorteos que caen en ese residuo sobrante se descartan y se realiza otra extracción.

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;

Esto cuesta una extracción adicional ocasional a cambio de un resultado exactamente uniforme. El mismo código está en la página de imparcialidad, donde es el propio texto explicativo y no una simple ilustración.

Los pesos son probabilidades, no favoritos

Asigna a una entrada un peso de 3 y obtendrá tres participaciones en el sorteo en lugar de una. La ruleta la dibuja como un sector más ancho y la lista muestra el porcentaje que ese peso representa en la práctica, para que nadie tenga que calcular divisiones a mano.

Dos entradas con el mismo texto siguen siendo dos entradas independientes. Cada una conserva su propia probabilidad y la lista indica cuántas repeticiones ha detectado en lugar de fusionarlas en silencio; reducir a la mitad las probabilidades de alguien sin avisar es una ayuda que nadie ha pedido.

Para qué sirve aún la animación

Una animación dirigida no es una animación ficticia. La ruleta recorre realmente la distancia hasta el sector en el que se detiene, los chasquidos coinciden con las divisiones que cruza y la vacilación de fallo por poco (cuando está activada) se detiene junto al ganador en lugar de en un sector aleatorio, continuando luego hasta la entrada sorteada antes de que todo empezara.

El suspense es real. El resultado simplemente se decidió antes de lo que parece.