51. Generación de números pseudoaleatorios

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.

51.1 Aleatoriedad y pseudoaleatoriedad

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.

DeterministaEl mismo estado produce el mismo siguiente valor.
Impredecible a simple vistaLa secuencia debe parecer uniforme.
ReproducibleUna semilla fija permite repetir resultados.
PeriódicoEl estado termina repitiéndose.

51.2 La semilla

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.

estado0=semilla;   estadoi+1=f(estadoi)

Una semilla no vuelve segura una secuencia. Solo controla el punto de partida y su reproducibilidad.

51.3 Generador congruencial lineal

Uno de los modelos históricos es el generador congruencial lineal:

Xn+1=(aXn+c) mod m
Un=Xn/m

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.

51.4 Período

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.

51.5 Uniformidad

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.

frecuencia esperada por casilla ≈ n/k

La uniformidad es necesaria, pero no suficiente: una secuencia puede tener frecuencias correctas y aun mostrar dependencia entre valores consecutivos.

51.6 Independencia y dependencia

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.

51.7 Math.random() en JavaScript

Math.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.

51.8 Transformaciones útiles

A partir de U uniforme se pueden generar otros valores:

Entero entre A y B: A+⌊(B−A+1)U⌋
Uniforme [a,b): a+(b−a)U

Para una variable discreta con probabilidades distintas se acumulan las probabilidades y se selecciona el primer intervalo que contiene a U.

51.9 Generación pseudoaleatoria en JavaScript

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.

51.10 Laboratorio de generadores

Compara la distribución de un generador congruencial reproducible con Math.random(). El gráfico agrupa los valores en intervalos de [0,1).

Uniformidad de una secuencia

Uniformidad pseudoaleatoriaFrecuencias de valores en intervalos uniformes.

51.11 Pruebas básicas de calidad

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.

51.12 Reproducibilidad en simulaciones

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.

51.13 Seguridad informática

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.

51.14 Aplicaciones

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.

51.15 Errores frecuentes

  • Confundir pseudoaleatoriedad con azar físico.
  • Usar un generador inseguro para contraseñas o tokens.
  • Elegir una semilla constante sin saber que vuelve repetible toda la simulación.
  • Evaluar la calidad mirando solo la media.
  • Usar un generador congruencial simple para simulaciones exigentes sin analizarlo.
  • Olvidar que los valores de Math.random() están en [0,1).

51.16 Qué debes recordar y conclusión

Xn+1=f(Xn)
Un∈[0,1)
calidad = uniformidad + baja dependencia + período suficiente

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.

Volver al índice