Cómo funciona la aleatoriedad en una computadora
Una computadora no genera azar real: genera números pseudoaleatorios usando un algoritmo que parte de una "semilla" (típicamente la hora actual con precisión de microsegundos). Si conocés la semilla y el algoritmo, podés predecir todos los números futuros. Para criptografía eso es fatal; para sorteos informales es irrelevante.
Los navegadores modernos exponen crypto.getRandomValues, que usa
fuentes de entropía del sistema operativo (mouse movements, ruido del CPU, eventos
de hardware) y produce números criptográficamente seguros. Cuando lo necesitamos,
lo usamos. Cuando no, Math.random alcanza.
Math.random vs crypto.getRandomValues
- Math.random: rápido, ligero, distribución uniforme. Apto para juegos, sorteos casuales, animaciones, simulaciones.
- crypto.getRandomValues: seguro contra adversarios. Necesario para tokens, claves, IDs únicos públicos, contraseñas. Más caro pero igual instantáneo a escala humana.
Sin repeticiones: el problema del "Fisher-Yates shuffle"
Generar 10 números únicos entre 1 y 100 no es trivial: si simplemente generás 10
al azar, hay alta probabilidad de duplicados. La solución correcta es construir
un array [1..100], mezclarlo con el algoritmo de Fisher-Yates, y
tomar los primeros 10. Eso garantiza unicidad y distribución uniforme. Es lo que
hacemos cuando activás "sin repeticiones".
Casos de uso prácticos
- Sorteos informales: "elegí un número entre 1 y N, el ganador es..."
- Asignación al azar: dividir un equipo en grupos, decidir quién presenta primero.
- Pruebas de software: generar datos de prueba, simular cargas, fuzz testing.
- Decisiones que no importan: "¿voy al gym hoy?" → 1 = sí, 2 = no.
- Educación: generar problemas de matemática con números cambiantes.
- Estadística: elegir muestras al azar de una población.
Cuándo NO usar este generador
- Sorteos con valor legal: rifas con premios materiales requieren sistemas certificados y, en muchos países, presencia notarial.
- Generación de claves o passwords: usá un generador de contraseñas dedicado (también tenemos uno).
- Lottery picks "para ganar": la lotería es un proceso físico independiente; ningún algoritmo predice ni mejora tus chances.
Distribución uniforme: el detalle invisible
Un buen RNG distribuye los números de manera uniforme: si generás 1000 números entre 1 y 10, esperás aproximadamente 100 de cada uno (con varianza estadística normal). Algoritmos malos sesgan ciertos valores. Los modernos (xorshift, PCG, los que usa V8 o SpiderMonkey) están bien testeados y no tienen este problema en la práctica.