Cómo funcionan los generadores de números aleatorios y cómo saber si uno es justo
Cuando pulsas "Generar" en un generador de números aleatorios, una computadora, una máquina diseñada para seguir instrucciones con precisión, produce algo que nadie puede predecir. Esta guía explica cómo funciona, cuál es la forma más común en que un generador puede ser sutilmente injusto y cómo juzgar si unos resultados son aleatorios.
Tres tipos de aleatoriedad
Generadores de números pseudoaleatorios
Un generador de números pseudoaleatorios (PRNG, por sus siglas en inglés) es una fórmula. Parte de un valor llamado semilla y lo transforma una y otra vez para producir una secuencia que parece aleatoria. Con la misma semilla, vuelve a producir exactamente la misma secuencia. Eso resulta útil en simulaciones y videojuegos que necesitan resultados reproducibles.
Math.random() de JavaScript es un PRNG. Sirve para animaciones y juegos informales. Sin embargo, los navegadores no garantizan que su salida sea impredecible, y la especificación no exige ninguna calidad concreta. No debe usarse para contraseñas, sorteos de premios ni nada en lo que alguien pueda beneficiarse de adivinar el siguiente resultado.
Generadores criptográficamente seguros
Un PRNG criptográficamente seguro (CSPRNG) está diseñado para que ver los resultados anteriores no ayude a predecir el siguiente. Los sistemas operativos lo inicializan a partir de eventos físicos impredecibles, como el ruido de temporización del hardware, y siguen incorporando entropía nueva. En los navegadores está disponible a través de la Web Crypto API como crypto.getRandomValues().
Generadores de números aleatorios por hardware
Un generador por hardware mide un proceso físico, como el ruido eléctrico, y lo convierte en bits. Los procesadores modernos incluyen uno, y los sistemas operativos combinan su salida con otras fuentes para inicializar su CSPRNG. La mayoría de la gente nunca necesita acceder a él directamente.
Qué usa Randomify: cada resultado se obtiene con crypto.getRandomValues() en tu propio navegador, compatible con todos los navegadores actuales. Los números se generan en tu dispositivo, y las listas que introduces no se suben a ningún servidor para generar un resultado.
La injusticia oculta: el sesgo del módulo
Una fuente aleatoria proporciona bits, no "un número del 1 al 6". Convertir lo uno en lo otro es donde fallan muchos generadores.
Supongamos que una fuente produce un byte aleatorio, un número entero del 0 al 255, y un programa necesita una tirada de dado. El atajo consiste en tomar el resto de dividir entre 6 y sumar 1. Pero 256 no es múltiplo de 6: 256 = 42 × 6 + 4. Los restos 0, 1, 2 y 3 pueden obtenerse de 43 formas cada uno, mientras que el 4 y el 5 solo de 42. Las caras del 1 al 4 son ligeramente más probables que el 5 y el 6.
La diferencia es pequeña, 43/256 en lugar de 42/256, pero es un sesgo sistemático, no una variación aleatoria. Cuanto mayor es el rango en relación con la fuente, mayor es el sesgo.
La solución es el muestreo por rechazo: descartar cualquier valor bruto que caiga en el último bloque incompleto y volver a sacar otro. En el ejemplo del byte, solo se aceptan los valores del 0 al 251, así que cada cara tiene exactamente 42 formas de salir. Randomify usa valores de 32 bits con muestreo por rechazo, de modo que todos los números de tu rango son igual de probables.
Pruébalo con cualquier rango:
Barajar de forma justa
Elegir nombres de una lista o repartir a personas en equipos requiere barajar de forma justa: todos los órdenes posibles deben ser igual de probables.
El método estándar es el algoritmo de Fisher–Yates. Empezando por el último elemento, se intercambia con un elemento elegido de manera uniformemente aleatoria entre los que aún no están fijados, incluido él mismo, y luego se avanza una posición hacia la izquierda. Con n elementos, produce cada uno de los n! órdenes posibles con la misma probabilidad.
Un atajo popular es ordenar la lista mediante comparaciones aleatorias. No produce órdenes igual de probables, y el sesgo depende del algoritmo de ordenación. El selector de nombres y el generador de equipos de Randomify usan Fisher–Yates.
Los resultados aleatorios parecen menos aleatorios de lo que esperamos
La gente tiende a esperar que las secuencias aleatorias alternen más de lo que realmente lo hacen. Una secuencia aleatoria real contiene rachas, agrupaciones y repeticiones.
| Lanzamientos de una moneda justa | Probabilidad de al menos una racha de… | Probabilidad |
|---|---|---|
| 10 | 3 resultados iguales seguidos | 82,6 % |
| 10 | 4 resultados iguales seguidos | 46,5 % |
| 100 | 5 resultados iguales seguidos | 97,2 % |
| 100 | 6 resultados iguales seguidos | 80,7 % |
| 100 | 7 resultados iguales seguidos | 54,2 % |
Así que una racha de seis caras en cien lanzamientos no indica ningún problema; lo sorprendente sería que no apareciera. Lo mismo vale para un generador de números aleatorios que devuelve el mismo número dos veces seguidas. Con un rango del 1 al 10, eso ocurrirá aproximadamente en una de cada diez extracciones.
Compruébalo tú mismo: lanza 100 monedas a la vez y busca la racha más larga.
Cómo comprobar si un generador es justo
No puedes demostrar que un generador es justo con unos pocos resultados, pero sí puedes detectar problemas evidentes:
- Reúne muchos resultados. Las muestras pequeñas varían mucho. Para un generador del 1 al 6, reúne cientos o miles de extracciones, no veinte.
- Compara las frecuencias con lo esperado. Cada valor debería aparecer aproximadamente el mismo número de veces. Los estadísticos usan la prueba de chi cuadrado para medir si las diferencias son mayores de lo que el azar suele producir.
- Fíjate en las secuencias, no solo en los recuentos. Un generador podría producir frecuencias perfectas repitiendo el ciclo 1, 2, 3, 4, 5, 6. Revisa también las repeticiones y las rachas.
- Pregunta cómo funciona. Una herramienta fiable debería indicar qué fuente aleatoria usa y cómo la convierte a un rango.
Para usos de alto riesgo, como claves de seguridad, sorteos regulados por ley o muestreos científicos, usa un generador documentado que cumpla la norma correspondiente y guarda un registro del proceso.
Preguntas frecuentes
¿El número aleatorio de una computadora es realmente aleatorio? Un CSPRNG es determinista una vez inicializado, pero su semilla procede de fenómenos físicos impredecibles, y en la práctica su salida no puede predecirse sin conocer su estado interno. Para sorteos cotidianos, juegos y contraseñas, es la opción adecuada.
¿Puedo reproducir un resultado más tarde? No con un generador criptográfico, y es intencionado. Para que un sorteo sea verificable, grábalo en pantalla o hazlo delante de testigos, como se explica en cómo organizar una rifa en línea justa.
¿Por qué obtuve el mismo número dos veces? Porque cada extracción es independiente. Desactiva los duplicados si necesitas que todos los resultados sean distintos, por ejemplo al sortear varios ganadores.
