
En el lenguaje cotidiano, "aleatorio" significa impredecible. En matemáticas e informática, la aleatoriedad tiene un significado preciso: una secuencia es aleatoria si conocer todos los valores anteriores no da ninguna ventaja para predecir el siguiente. Lograr verdadera aleatoriedad en una máquina determinista es fundamentalmente difícil: los ordenadores siguen instrucciones exactas, lo cual es lo opuesto de la imprevisibilidad. Las soluciones a este problema se dividen en dos grandes categorías: los generadores de números pseudoaleatorios (PRNG) y los generadores de números verdaderamente aleatorios (TRNG).
Un PRNG es un algoritmo determinista que produce una secuencia de números que parece aleatoria, pero está completamente determinada por un valor inicial llamado semilla. Con la misma semilla, un PRNG siempre produce la misma secuencia. Puede sonar como un defecto, pero es en realidad una propiedad útil en muchos contextos.
El PRNG moderno más utilizado es el Mersenne Twister, que tiene un período de 2^19937 − 1 (es decir, produce esa cantidad de valores antes de repetirse). Supera casi todas las pruebas estadísticas de aleatoriedad. La mayoría de las funciones aleatorias de propósito general en lenguajes de programación — el módulo random de Python, java.util.Random de Java, Math.random() de JavaScript — utilizan un PRNG internamente.
La limitación crítica: los PRNG no son criptográficamente seguros. Si un atacante puede observar suficientes salidas, puede reconstruir el estado interno y predecir todas las salidas futuras. Para cualquier cosa sensible a la seguridad, no deben usarse PRNG.
Un CSPRNG es un PRNG diseñado para ser computacionalmente inviable de predecir, incluso conociendo las salidas anteriores. Lo logra mediante funciones criptográficas unidireccionales y se inicializa con una fuente de entropía genuina. Los sistemas operativos proporcionan CSPRNG a través de interfaces como /dev/urandom en Linux/macOS y CryptGenRandom en Windows.
En código de aplicación:
secrets (úsalo, no random, para contraseñas y tokens)crypto.randomBytes() y crypto.randomUUID()window.crypto.getRandomValues()java.security.SecureRandomUsa siempre la API criptográfica aleatoria para operaciones sensibles a la seguridad: generación de contraseñas, tokens, IDs de sesión, claves de API, claves criptográficas y nonces.
Los TRNG derivan la aleatoriedad de procesos físicos genuinamente impredecibles: ruido térmico en componentes electrónicos, desintegración radiactiva, ruido atmosférico o tiempos de llegada de fotones. Los módulos de seguridad de hardware (HSM) utilizados en banca y entidades certificadoras incluyen TRNG. Servicios como random.org generan números aleatorios a partir del ruido atmosférico y se utilizan frecuentemente como fuentes de aleatoriedad verificablemente justas para loterías y concursos.
Los CSPRNG del sistema operativo suelen inicializarse con fuentes de entropía de hardware (tiempos de teclado, E/S de disco, chips TRNG de hardware como Intel RDRAND) y luego usan un algoritmo CSPRNG para expandir esa entropía en un flujo. Este enfoque híbrido combina la imprevisibilidad de la entropía hardware con la velocidad de la generación por software.
Math.random() o equivalente para estos casos.Cuando la reproducibilidad importa — recrear un escenario de prueba específico, compartir un resultado generado, depurar una simulación — puedes inicializar un PRNG con un valor fijo y siempre obtener la misma salida. Muchos juegos usan una semilla para la generación del mundo, lo que permite a los jugadores compartir semillas de mapas interesantes. Los investigadores de aprendizaje automático suelen inicializar las librerías aleatorias al comienzo de un experimento para garantizar resultados reproducibles entre ejecuciones.
La calidad de tu semilla también importa. Un PRNG inicializado con la marca de tiempo actual en milisegundos es predecible si un atacante sabe aproximadamente cuándo se inició tu aplicación. Para propósitos no relacionados con la seguridad, una semilla de marca de tiempo suele estar bien; para cualquier caso en que la salida deba ser imposible de adivinar, usa un CSPRNG para generar la semilla.
Abre el generador de números aleatorios gratuito — genera uno o varios números aleatorios dentro de cualquier rango, con o sin repetición. Funciona en tu navegador.