Números Pseudoaleatorios · Tema 15

Generadores congruenciales combinados

Cómo mezclar dos o más LCG para multiplicar el período y romper estructuras: la idea de L'Ecuyer y Wichmann–Hill sin magia.

01 · Punto de partida

Si uno se queda corto, usá dos

Un LCG solo está limitado por su m: para alargarlo hay que agrandar el módulo (más costo, más overflow). La alternativa de los 80s fue combinar: correr dos o tres LCG chicos en paralelo y mezclar sus salidas. El período resultante es el mínimo común múltiplo de los períodos, que puede ser gigantesco con módulos modestos.

Además la mezcla rompe parte de la estructura reticular de cada componente: lo que era una diagonal en uno se difumina al restarlo con otro.

  • ¿Cómo se combinan dos secuencias en una?
  • ¿Por qué el período se multiplica (mcm) en vez de sumarse?
  • ¿Qué combinaciones clásicas debes conocer?
  • ¿Cuándo conviene combinar y cuándo migrar a moderno?

02 · Definición

Componentes, mezcla y período

◈

Componentes

Dos (o tres) LCG con módulos distintos y coprimos, cada uno con su semilla. Ejemplo didáctico: m₁=16 y m₂=15.

⇄

Mezcla

Resta o suma modular: z = (x − y) mod m₁ (L'Ecuyer) o suma ponderada mod 1 (Wichmann–Hill). Nunca promediar flotantes.

▣

Período mcm

El combinado vuelve al inicio cuando ambos vuelven juntos: cada mcm(p₁,p₂). Con coprimos es el producto.

Dos clásicos para ubicar.
CombinadoComponentesPeríodo
Didáctico (este tema)m₁=16, m₂=15mcm(16,15) = 240
Wichmann–Hill (1982)3 LCG chicos≈ 2⁴² ≈ 4·10¹²
L'Ecuyer MRG32k3a2 MRG de orden 3≈ 2¹⁹¹ ≈ 10⁵⁷

03 · Por qué funciona

El mcm en una imagen mental

Dos ruedas dentadas
Una de 16 dientes y otra de 15: solo cada 240 pasos vuelven ambas al diente inicial juntas. Ese es el ciclo combinado.
Coprimos rinden
Si mcd(p₁,p₂)=1, mcm = p₁·p₂ (máximo). Si comparten factores, el mcm se achica: por eso los módulos se eligen coprimos.
Mezcla rompe forma
Restar desordena la retícula de cada uno: diagonales que eran claras se vuelven nube. No la elimina del todo, pero la atenúa.

Buena combinación

Componentes sanos + coprimos

Período producto, mezcla modular documentada, cada semilla registrada por separado.

Mala combinación

Basura + basura

Dos malos combinados dan un mediocre largo: período grande con estructura heredada. No se recicla chatarra.

04 · Ejemplos

De 16 y 15 a 240

x(n), y(n)→z = (x−y) mod 16→u = z/16
  1. 1
    Componente A.

    (5,3,16), p₁ = 16, semilla 7.

  2. 2
    Componente B.

    (7,5,15) (7−1=6 divisible por 3 y 5, c coprimo): p₂ = 15, semilla 4.

  3. 3
    Combinado.

    z = (x−y) mod 16, p = 240 = 16·15. Con N = 48 ya no se repite (el solo daba 3 vueltas).

05 · Implementación en Python

Dos estados, una mezcla

Python en tu navegador. Cambiá una semilla y observá que cambia la mezcla pero no el período.

def combinado(s1, s2, n=12):
    x, y = s1, s2
    sal = []
    for _ in range(n):
        x = (5 * x + 3) % 16
        y = (7 * y + 5) % 15
        z = (x - y) % 16
        sal.append(round(z / 16, 4))
    return sal


print(combinado(7, 4))

Doce uniformes sin repetición visible: con N = 48 el solo ya daba vueltas y este no.

Período como mcm

import math

print(math.lcm(16, 15))
print(math.lcm(8, 12))

06 · Exploración

Laboratorio: 16 × 15 = 240

Elegí preset y N. La curva lima es el combinado; las finas son A y B. El panel da p₁, p₂, p combinado y vueltas. Compará con el solo del Tema 10.

EXPERIMENTO 15

El producto de los ciclos

p = mcm(p₁, p₂)

Los resultados numéricos aparecen debajo.
p₁ · p₂—
p combinado—
Vueltas N/p—
Lectura—

Con buenos, p = 240: N = 96 no repite.

Si N supera p, el combinado también se repite: solo que tarda 240 en vez de 16.

Preguntas para explorar

  1. Con buenos y N = 96, ¿cuántas vueltas da el combinado? ¿Y el A solo?
  2. Poné N = 480: ¿el combinado repite? ¿Cuántas vueltas?
  3. Con ambos malos, ¿el período combinado te salva? ¿Qué calidad esperarías?
Ver respuestas sugeridas
  1. Combinado 0,4 vueltas (sin repetir); A solo 6 vueltas. La ganancia es 15×.
  2. Sí: 2 vueltas exactas. Largo no es infinito: solo 15× más largo.
  3. No: p puede crecer pero la estructura heredada queda. Malos + malos = mediocre largo.

07 · Comprensión

Confusiones frecuentes

«El período se suma»

No: es el mcm, no la suma. 16 + 15 = 31 es falso; 16 × 15 = 240 (coprimos) es lo correcto.

«Promedio las dos salidas»

(u₁+u₂)/2 deja de ser uniforme (tiende al centro). La mezcla válida es modular en enteros.

«Con la misma semilla en ambos alcanza»

Usar s₁ = s₂ correlaciona los arranques y puede acortar el ciclo efectivo. Semillas independientes y registradas.

«Combinar cura cualquier LCG»

Solo multiplica el largo y atenúa formas. Si los componentes son malos, el combinado es largo y mediocre.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: mcm a mano

Calculá el período combinado de p₁ = 16 y p₂ = 15, y de p₁ = 8 y p₂ = 12. ¿Por qué el segundo no es producto?

import math

print(math.lcm(16, 15))
print(math.lcm(8, 12))
print(math.gcd(8, 12))
Ver solución razonada

240 y 24. El segundo comparte factor 4 (mcd 4), así que mcm = 8·12/4 = 24, no 96. Coprimos rinden al máximo.

Ejercicio 2: medir el combinado

Medí p del combinado didáctico por diccionario y compará con 240.

def p_combinado(s1=7, s2=4):
    v = set()
    x, y = s1, s2
    while (x, y) not in v:
        v.add((x, y))
        x = (5 * x + 3) % 16
        y = (7 * y + 5) % 15
    return len(v)


print(p_combinado())
Ver solución

Da 240: el par (x,y) recorre todas las combinaciones antes de repetir. Esa es la prueba del producto.

Ejercicio 3: malos no se reciclan

Combiná (4,2,16) con (4,2,15 adaptado) y medí p y calidad visual con N = 120. ¿Largo salva?

Ver una posible respuesta
def comb_malo(s1=7, s2=4, n=120):
    x, y = s1, s2
    sal = []
    for _ in range(n):
        x = (4 * x + 2) % 16
        y = (4 * y + 2) % 15
        sal.append((x - y) % 16 / 16)
    return sal


v = comb_malo()
print(len(set(round(u, 9) for u in v)), "distintos en 120")

Pocos distintos aunque p crezca algo: largo sin mezcla sana no es calidad. Lección anti-reciclaje.

09 · Síntesis

Ideas para recordar

  • Combinar = avanzar varios LCG y mezclar con resta/suma modular.
  • Período = mcm; con coprimos es el producto.
  • Clásicos: Wichmann–Hill y L'Ecuyer (MRG32k3a).
  • No promediar uniformes; no reusar semilla; no reciclar malos.
  • Largo multiplica, calidad se atenúa pero no se inventa.

En el próximo tema cambiaremos de familia: generadores basados en desplazamientos de bits, velocidad pura con álgebra binaria.