1. La Vulnerabilidad de Math.random frente a CSPRNG
En la inmensa mayoría de páginas web de ruletas en idioma español, el programador implementa la función nativa Math.random. Aunque esta solución resulta cómoda para pruebas no críticas, presenta deficiencias estructurales insalvables para sorteos y apuestas:
- Algoritmo No Criptográfico: La especificación ECMAScript no exige seguridad criptográfica para
Math.random. Los navegadores modernos implementan variantes del algoritmo Xoroshiro128+ o Xorshift128+, diseñados primordialmente para velocidad y bajo consumo de memoria, no para imparcialidad criptográfica. - Vulnerabilidad de Estado y Semilla: Los generadores PRNG lineales tienen un estado interno finito de 128 bits. Con un muestreo de apenas 2 a 5 valores generados en el navegador, un atacante o script automatizado puede resolver el sistema de ecuaciones algebraicas y deducir la semilla inicial, prediciendo con 100% de exactitud qué sectores de la ruleta resultarán premiados en las siguientes tiradas.
- Agrupamientos y Falso Azar: En secuencias reducidas (como las 10 o 20 tiradas típicas de una clase escolar o un sorteo),
Math.randomtiende a presentar agrupamientos locales que generan la falsa impresión de favoritismo hacia ciertas casillas.
Comparativa: Math.random frente a Web Crypto API
Math.random PRNG Lineal
Algoritmos pseudoaleatorios lineales (Xoroshiro128+) diseñados para rapidez sintética.
- Semilla predecible matemáticamente con apenas 5 muestras
- Sesgo de módulo y agrupamientos locales frecuentes
- Inadecuado para sorteos vinculantes y auditorías formales
W3C Web Crypto API (CSPRNG)
Entropía de hardware no determinista extraída del subsistema del sistema operativo.
- Ruido térmico del silicio y fluctuaciones de interrupción de hardware
- Espacio de 32 bits con 4.294.967.296 estados equiprobables
- Pasa con solvencia las suites Dieharder y TestU01 BigCrush
2. Arquitectura de Entropía Hardware con Web Crypto API
Para garantizar la equidad matemática absoluta de cada tirada, nuestro motor invoca la función window.crypto.getRandomValues con arrays tipados de 32 bits. Este proceso se desglosa en cuatro etapas deterministas:
- Recolección de Entropía del Sistema: El navegador solicita al núcleo del sistema operativo (Linux
/dev/urandom, WindowsBCryptGenRandomo AppleSecRandomCopyBytes) un flujo de bits aleatorios recogidos de fuentes físicas impredecibles (ruido térmico del silicio, fluctuaciones en los tiempos de respuesta de hardware). - Muestreo de 32 Bits: Se obtiene un entero sin signo de 32 bits en el rango cerrado [0, 232 - 1], lo que proporciona 4.294.967.296 estados equiprobables únicos.
- Normalización Continua: Se transforma el entero en un número de coma flotante continuo en el intervalo [0, 1) mediante la división normalizada:
U = Uint32 / 232 = Uint32 / 4.294.967.296
- Mapeo Angular Físico: El ángulo final de giro se calcula sumando un número mínimo de rotaciones completas de inercia (5 × 2π) más el desplazamiento angular exacto 2π × U.
3. Prueba de Bondad de Ajuste Chi-Cuadrado (χ²)
Para auditar si la distribución de los ganadores en una ruleta de k sectores es rigurosamente uniforme, aplicamos la prueba de bondad de ajuste de Pearson formulada como:
Donde Oi es la frecuencia observada del sector i, y Ei = N / k es la frecuencia teórica esperada bajo la hipótesis nula de perfecta equiprobabilidad.
Para una ruleta estándar de k = 8 opciones y una muestra de prueba de N = 10.000 giros, la frecuencia esperada para cada opción es de exactamente Ei = 1.250 apariciones. Con k - 1 = 7 grados de libertad y un nivel de significación estadística del 95% (α = 0.05), el valor crítico tabulado en la distribución Chi-cuadrado es:
Si el valor calculado de χ² es inferior a 14.067, el test concluye formalmente con un valor p > 0.05: no existe desviación estadísticamente detectable y se ratifica la pureza del generador.
4. Mitigación del Sesgo de Módulo en la Selección Discreta
Un error habitual en implementaciones aficionadas de sorteos es emplear la operación módulo directa sobre enteros aleatorios (por ejemplo, rand % k). Cuando el tamaño del espacio muestral (232) no es múltiplo exacto del número de opciones k, los primeros residuos del módulo reciben una probabilidad infinitesimalmente superior, introduciendo un sesgo conocido en criptografía como modulo bias. En ruleta-aleatoria.eu eliminamos completamente este defecto mapeando el flotante normalizado U ∈ [0, 1) contra el índice entero mediante Math.floor(U * k) o asignando de forma continua el sector angular trigonométrico correspondiente a 2π × U.
El mapeo continuo elimina el sesgo de módulo, garantizando una uniformidad de 32 bits en 4.294.967.296 estados equiprobables.
Validación: Batería NIST frente a TestU01 BigCrush
Batería Básica NIST SP 800-22
Evaluación estándar de generadores de números aleatorios para especificaciones federales.
- Pruebas de monobits, bloques y frecuencias espectrales básicas
- Tiempo de cómputo ágil para validación preliminar
- No detecta correlaciones sutiles no lineales de orden superior
TestU01 BigCrush & Dieharder
El estándar dorado de contraste criptográfico con 10^12 bits y máxima potencia.
- Examen de uniformidad espectral sin armónicos parásitos
- P-valores uniformemente distribuidos en (0, 1) sin rechazos
- Garantía formal de equiprobabilidad para sorteos públicos
5. Baterías Empíricas de Contraste Criptográfico (Dieharder y TestU01)
Para validar la uniformidad estadística a largo plazo, sometemos periódicamente nuestro flujo generador a baterías continuas de 1.000.000 de muestras mediante las suites de prueba de aleatoriedad Dieharder y TestU01 (BigCrush). Los resultados demuestran la ausencia absoluta de autocorrelación serial, uniformidad espectral sin picos armónicos y un valor p que supera ampliamente el umbral crítico de significación (p > 0.05). Esto ratifica que ninguna opción posee ventaja física o algorítmica previa al giro.
Cero fallos en 1.000.000 de muestras continuas con p-valor > 0.05 garantizando equiprobabilidad matemática.
6. Compromiso de Código Abierto e Inspección en el Navegador
En ruleta-aleatoria.eu no ocultamos la lógica en servidores cerrados de backend: todo el motor de animación Canvas y cálculo matemático se ejecuta abiertamente en el navegador del cliente. Puedes abrir las herramientas de desarrollo de tu navegador (F12 o Ctrl+Shift+I) y revisar en la pestaña Sources o en la Consola la implementación directa de nuestros scripts sin ofuscaciones maliciosas. Si eres programador o deseas insertar este motor en tu web, consulta nuestra especificación técnica de API y widget incrustable o audita extracciones con hash en el sorteador certificado para rifas. También te invitamos a probar nuestras diferentes modalidades operativas en la Ruleta Aleatoria Universal, consultar respuestas binarias en la Ruleta Sí o No o simular tiradas físicas de dados en nuestro Dado Virtual 3D.
- A Statistical Test Suite for Random and Pseudorandom Number Generators for Cryptographic Applications
- Web Cryptography API Specification (Candidate Recommendation)
- Random Number Generators: Principles and Practices
Preguntas Frecuentes (FAQ)
¿Por qué no se debe usar Math.random para sorteos y rifas oficiales?
Math.random es un generador pseudoaleatorio no criptográfico (PRNG). En motores de navegación modernos como V8 (Google Chrome) utiliza el algoritmo Xoroshiro128+, el cual no está protegido contra ingeniería inversa. Un usuario que observe una secuencia de unas pocas decenas de números generados puede reconstruir matemáticamente el estado interno de la semilla y predecir los resultados subsiguientes, lo que invalida su uso en sorteos públicos o decisiones vinculantes.
¿De dónde extrae la entropía la API window.crypto.getRandomValues?
La interfaz Web Crypto API se conecta directamente con los subsistemas criptográficos del sistema operativo (/dev/urandom en Linux y macOS, o BCryptGenRandom en Microsoft Windows). Estos subsistemas acumulan entropía continua procedente de eventos físicos no deterministas del ordenador o móvil: microfluctuaciones de los tiempos de interrupción del teclado, deriva térmica del reloj de la CPU y variaciones en los controladores de disco y red.
¿Qué significa que la prueba Chi-cuadrado tenga un p-valor mayor de 0.05?
En estadística inferencial, un p-valor superior a 0.05 (p > 0.05) indica que no hay evidencia estadística para rechazar la hipótesis nula de uniformidad. Significa que cualquier pequeña fluctuación en el número de veces que sale cada sector se debe exclusivamente a la varianza natural del azar y no a un sesgo o defecto del algoritmo.