Generador de números aleatorios
Generá uno o varios números aleatorios dentro del rango que elijas. Sin repeticiones opcional, copiable o exportable.
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.
Preguntas frecuentes
¿Es realmente aleatorio?
Usamos crypto.getRandomValues (criptográficamente seguro) cuando está disponible. En el peor caso, Math.random, que es pseudoaleatorio pero uniforme.
¿Sin repeticiones?
Sí. Activamos Fisher-Yates shuffle para garantizar unicidad. Si pedís más números que el rango, te avisamos.
¿Sirve para sorteos legales?
Para sorteos informales sí. Sorteos con valor legal requieren sistema certificado y notario.
¿Cuál es el rango máximo?
JavaScript soporta enteros seguros hasta ±2^53. En la práctica, cualquier rango razonable (millones, billones) funciona.