Los programas no producen azar verdadero de manera ordinaria: ejecutan algoritmos deterministas que generan secuencias con propiedades parecidas a las de números aleatorios. Comprender sus semillas, períodos y limitaciones es esencial para simular correctamente.
Un número pseudoaleatorio se calcula a partir de un estado interno y una regla. Si se conoce el estado y el algoritmo, la secuencia puede reproducirse. Para simulación esto es útil: permite repetir un experimento y depurar un programa.
La semilla es el estado inicial del generador. Dos ejecuciones con la misma semilla producen la misma secuencia; dos semillas diferentes suelen producir secuencias diferentes.
Una semilla no vuelve segura una secuencia. Solo controla el punto de partida y su reproducibilidad.
Uno de los modelos históricos es el generador congruencial lineal:
Los parámetros a, c y m determinan el período y la calidad. No basta con elegir números grandes: deben cumplir condiciones apropiadas para recorrer el espacio de estados.
Como el estado pertenece a un conjunto finito, toda secuencia determinista termina repitiendo un estado. El número de pasos hasta la repetición es el período.
Un período corto puede provocar que una simulación larga repita patrones. Los generadores modernos usan estados grandes y técnicas diseñadas para obtener períodos enormes.
Para simular una variable uniforme en [0,1), los valores deben repartirse aproximadamente de manera homogénea. Si dividimos el intervalo en k casillas, cada una debería recibir cerca de n/k observaciones.
La uniformidad es necesaria, pero no suficiente: una secuencia puede tener frecuencias correctas y aun mostrar dependencia entre valores consecutivos.
En un modelo ideal, conocer un valor no debería permitir predecir otro. Los generadores pseudoaleatorios intentan reducir correlaciones y estructuras visibles, pero toda secuencia algorítmica tiene dependencias internas.
La calidad debe evaluarse con pruebas estadísticas y según la aplicación concreta.
Math.random() en JavaScriptMath.random() devuelve un número pseudoaleatorio mayor o igual que 0 y menor que 1. No permite elegir directamente una semilla en la API estándar y su algoritmo depende del motor de JavaScript.
Es adecuado para ejemplos, juegos y simulaciones comunes, pero no debe emplearse para claves, tokens, contraseñas o sorteos que requieran seguridad.
A partir de U uniforme se pueden generar otros valores:
Para una variable discreta con probabilidades distintas se acumulan las probabilidades y se selecciona el primer intervalo que contiene a U.
El siguiente generador congruencial lineal produce una secuencia reproducible a partir de una semilla:
function generador(semilla) {
let estado = semilla;
return function () {
estado = (1664525 * estado + 1013904223)
% 4294967296;
return estado / 4294967296;
};
}
const aleatorio = generador(12345);
console.log(aleatorio(), aleatorio());La misma semilla genera la misma pareja de valores en cada ejecución.
Compara la distribución de un generador congruencial reproducible con Math.random(). El gráfico agrupa los valores en intervalos de [0,1).
Una prueba de frecuencias compara los conteos observados con los esperados. También pueden estudiarse medias, varianzas, autocorrelaciones, pares de valores y rachas.
Una prueba que pasa no demuestra que el generador sea perfecto; solo indica que no se detectó un problema con ese método y ese tamaño de muestra.
Fijar una semilla permite investigar errores, comparar versiones del programa y repetir resultados en una publicación. Durante una exploración puede ser conveniente cambiarla para observar la variabilidad entre corridas.
La semilla y los parámetros del generador deben registrarse junto con los resultados importantes.
Los generadores para simulación priorizan velocidad, período y propiedades estadísticas. La seguridad necesita generadores criptográficamente seguros, diseñados para resistir la predicción aun cuando se observen muchos valores.
En el navegador puede usarse crypto.getRandomValues() para obtener aleatoriedad apropiada para ciertos usos de seguridad, según el contexto.
Los números pseudoaleatorios se usan en simulación Monte Carlo, juegos, muestreo, pruebas de software, optimización, aprendizaje automático, colas y análisis de riesgos. La elección del generador debe corresponder al objetivo y al costo de los errores.
Math.random() están en [0,1).Los números pseudoaleatorios son la materia prima de muchas simulaciones. Un buen resultado requiere conocer el generador, controlar la semilla cuando sea necesario y distinguir con claridad entre simulación estadística y seguridad informática.