Randomizer
Generador de números, listas y elecciones aleatorias
Elegir un ganador
Mezclar una lista
Herramientas rápidas
Probabilidad 50/50
Historial reciente
- Sin actividad reciente en esta sesión.
La aleatoriedad en computadoras es pseudo-aleatoria (algoritmo determinista) a menos que se use una fuente criptográfica como crypto.getRandomValues().
¿Qué es la Pseudo-Aleatoriedad?
Las computadoras son máquinas deterministas — ejecutan instrucciones en una secuencia predecible. La verdadera aleatoriedad requiere una fuente física de entropía: desintegración radiactiva, ruido atmosférico o fluctuaciones térmicas. Como la mayoría de los programas no pueden acceder a estas fuentes directamente, utilizan generadores de números pseudo-aleatorios (PRNGs) en su lugar.
Un PRNG es un algoritmo matemático que produce una secuencia de números que parece aleatoria pero que en realidad está completamente determinada por un valor inicial llamado semilla. Dada la misma semilla, un PRNG siempre producirá la misma secuencia. Este determinismo es invisible en uso normal porque la semilla se deriva típicamente de fuentes impredecibles como el reloj del sistema o los movimientos del ratón.
La calidad de un PRNG se mide por qué tan bien su salida resiste el análisis estadístico. Un buen PRNG produce secuencias que pasan las pruebas de aleatoriedad — distribución uniforme, sin patrones detectables, largos períodos antes de repetirse. Pero la aleatoriedad estadística no es lo mismo que la seguridad criptográfica.
Math.random() vs crypto.getRandomValues()
JavaScript proporciona dos enfoques fundamentalmente diferentes para la aleatoriedad:
Math.random() devuelve un número de punto flotante entre 0 (inclusivo) y 1 (exclusivo). Usa un algoritmo PRNG (típicamente xorshift128+ en motores modernos) que es rápido y estadísticamente adecuado para la mayoría de los propósitos. Sin embargo, no es criptográficamente seguro — el estado interno puede reconstruirse a partir de las salidas observadas, permitiendo a un atacante predecir valores futuros.
crypto.getRandomValues() llena un arreglo tipado con valores aleatorios criptográficamente fuertes obtenidos del pool de entropía del sistema operativo (/dev/urandom en Linux, CryptGenRandom en Windows). Estos valores son adecuados para aplicaciones sensibles a la seguridad como generar contraseñas, claves de cifrado y tokens de sesión.
| Propiedad | Math.random() | crypto.getRandomValues() |
|---|---|---|
| Velocidad | Muy rápido | Ligeramente más lento |
| Semilla | Interna (automática) | Pool de entropía del SO |
| Predecible | Sí (si se conoce el estado) | No |
| Caso de uso | Juegos, mezclas, UI | Contraseñas, tokens, criptografía |
| Salida | Flotante 0-1 | Arreglo de enteros |
La regla general es simple: si alguien podría obtener una ventaja al predecir los valores “aleatorios”, usa crypto.getRandomValues(). Para todo lo demás, Math.random() es suficiente.
El Algoritmo Fisher-Yates
El algoritmo Fisher-Yates (también conocido como mezcla de Knuth) es el algoritmo estándar para reordenar aleatoriamente una lista. Produce una permutación imparcial — cada orden posible tiene exactamente la misma probabilidad.
El algoritmo funciona en el lugar iterando desde el último elemento hasta el primero. En cada posición, intercambia el elemento actual con un elemento elegido aleatoriamente de la porción no mezclada restante:
for i from n-1 down to 1:
j = random integer from 0 to i
swap array[i] and array[j]
Un error común es la “mezcla ingenua” que elige una posición aleatoria de todo el arreglo en cada paso. Esto produce una distribución sesgada — algunas permutaciones aparecen más frecuentemente que otras. El algoritmo Fisher-Yates evita esto reduciendo el rango de selección en cada paso.
Aleatoriedad con Semilla para Reproducibilidad
Aunque la imprevisibilidad suele ser el objetivo, hay casos donde quieres que la aleatoriedad sea reproducible:
- Pruebas: Las pruebas deterministas que usan datos aleatorios necesitan la misma secuencia en cada ejecución para evitar resultados inestables
- Generación procedural: Los juegos y simulaciones generan el mismo mundo a partir de la misma semilla, permitiendo “semillas de mundo” compartibles (Minecraft, Terraria)
- Simulaciones científicas: Los métodos de Monte Carlo requieren secuencias aleatorias reproducibles para revisión por pares y validación
Math.random() de JavaScript no soporta semillas explícitas. Para aleatoriedad con semilla, usa bibliotecas que implementan PRNGs con semilla como Mersenne Twister o mulberry32.
Casos de Uso Comunes
- Selección aleatoria: Elegir ganadores de un concurso, seleccionar elementos aleatorios para revisión o elegir grupos para pruebas A/B
- Mezcla: Aleatorizar preguntas de examen, orden de lista de reproducción, mazos de cartas o diapositivas de presentación
- Muestreo: Extraer un subconjunto aleatorio de un conjunto de datos grande para análisis o pruebas
- Generación procedural: Crear contenido aleatorio pero determinista — mapas, texturas, nombres o datos de prueba
- Balanceo de carga: Distribuir aleatoriamente solicitudes entre servidores para evitar puntos calientes (con aleatoriedad ponderada para capacidades desiguales de servidores)
Prueba estos ejemplos
Elige un ganador aleatorio de la lista usando una fuente criptograficamente segura. Cada participante tiene la misma probabilidad de ser seleccionado.
Alice
Bob
Charlie
Diana
Eve Elige un equipo al azar de la lista. Util para asignar tareas, elegir un orden de presentacion o tomar decisiones rapidas.
Ingenieria
Diseno
Marketing
Producto
QA