Números Pseudoaleatorios · Tema 10

Período de un generador

Por qué toda secuencia calculada está condenada a repetirse, cómo medir el ciclo y la regla de oro: tu N debe ser diminuto frente al período.

01 · Punto de partida

Finito por dentro, cíclico por fuera

En los Temas 4 y 7 viste el síntoma: con módulo 16 la secuencia se repetía calcada cada 16. No era casualidad de esos parámetros: es un teorema de cajón. Un generador guarda su estado en bits finitos (32, 64, 19937…); hay solo finitos estados posibles. Tarde o temprano un estado se repite, y desde ahí toda la historia futura se repite idéntica.

Ese largo del ciclo es el período p: la cantidad de valores antes de volver al inicio. Si tu simulación consume más valores que el período, estás reutilizando el mismo «azar» dos veces sin saberlo.

  • ¿Qué es exactamente el período y qué no es?
  • ¿Por qué el estado finito obliga al ciclo?
  • ¿Cuánto más grande debe ser el período que tu N?
  • ¿Cómo lo medís con código en un juguete y qué inferís en uno real?

02 · Definición

Ciclo, cola y período máximo

◈

Período p

Largo del ciclo que se repite. En un LCG puro desde la semilla ya estás en el ciclo: todo lo que generes es el anillo rotando.

⇄

Período máximo

El techo teórico: m en un mixto bien elegido, m−1 en un multiplicativo (el cero no participa). Es el Tema 14.

▣

N ≪ p

En la práctica se pide N miles o millones de veces menor que p. Con p = 2³¹ no simules miles de millones.

Períodos para calibrar la escala.
GeneradorPeríodo típicoQué N tolera
Juguete m = 16≤ 16Demos de aula, nada más
LCG clásico m = 2³¹−1≈ 2·10⁹Millones con cuidado
Mersenne Twister2¹⁹⁹³⁷−1 (enorme)Casi cualquier N práctico
Malo (4·x+2) mod 64≤ 8Ni un histograma serio

03 · Medición

Medir el ciclo sin perderse

Diccionario de vistos
Guardá estado → índice hasta repetir: la distancia es el período. Solo viable con m chico (juguetes).
Distintos en N
Si con N = 5000 solo hay 8 distintos, el período ≤ 8 sin más teoría. Es el olfato del Tema 7.
Marca de repetición
Graficá u(n) y marcá dónde reaparece x₀: ahí cierra el primer ciclo.
Teoría, no fuerza bruta
Con m = 2³² no podés iterar el período: se demuestra con aritmética (Temas 13–14), no corriendo.

Uso sano

N aguja en pajar

Consumís una fracción minúscula del ciclo: nunca ves la repetición y los tests no la detectan.

Uso roto

N da vueltas al anillo

Das 3 vueltas al ciclo en una corrida: histogramas con picos calcados y correlación espuria.

04 · Ejemplos

El mismo N, tres destinos

Parámetros→Período p→Vueltas N/p
  1. 1
    Juguete bueno, N = 48.

    p = 16: 3 vueltas exactas. El gráfico se repite calcado 3 veces.

  2. 2
    Malo, N = 48.

    p = 4: 12 vueltas. Tu «azar» tiene 4 valores distintos.

  3. 3
    Real, N = 10⁶.

    Con p ≈ 2·10⁹: 0,05 % del ciclo. Ni te enterás del anillo.

05 · Cómputo en Python

Detectar el período en un juguete

Con módulo chico podés ver el cierre del ciclo con tus ojos y generalizar la idea.

Python en tu navegador. Cambiá a los parámetros malos y mirá cómo el período se derrumba.

def periodo(semilla, a, c, m):
    visto = {}
    x = semilla
    i = 0
    while x not in visto:
        visto[x] = i
        x = (a * x + c) % m
        i += 1
    return i - visto[x]


print("bueno:", periodo(7, 5, 3, 16))
print("malo:", periodo(7, 4, 2, 16))

Bueno ≈ 16, malo ≤ 4. Esa sola línea decide si el generador sirve para algo más que un dibujo.

¿Cuántas vueltas das?

p, N = 16, 48
print("vueltas:", N / p)
print("fracción usada del ciclo real 2**31:", 10**6 / 2**31)

06 · Exploración

Laboratorio: vueltas al anillo

Elegí parámetros y N. La línea vertical marca el fin del primer período; si N lo supera, verás el dibujo repetirse. El panel informa p, vueltas y estados distintos.

EXPERIMENTO 10

El ciclo inevitable

N / p = vueltas

Los resultados numéricos aparecen debajo.
Período p—
Vueltas N/p—
Distintos—
Estado—

Con (5,3,16) y N=48 das 3 vueltas.

Pasada la marca vertical, todo es repetición calcada: el generador no tiene nada nuevo para darte.

Preguntas para explorar

  1. Con (5,3,16) y N = 16, ¿cuántas vueltas das? ¿Y con N = 48?
  2. Poné (4,2,16): ¿p? ¿Cuántas vueltas con N = 48? ¿Qué histograma saldría?
  3. Si tu simulación necesita 10⁶ valores, ¿qué p mínimo pedirías con criterio conservador?
Ver respuestas sugeridas
  1. 1 vuelta justa y 3 vueltas. Con 1 ya estás al límite; con 3 estás reciclando.
  2. p ≤ 4 y 12+ vueltas: histograma de 4 picos, inútil para uniformidad.
  3. Órdenes de magnitud por encima: miles de millones como piso (p ≫ N, ideal p > 1000·N).

07 · Comprensión

Confusiones frecuentes

«Período = m siempre»

Solo con parámetros que dan período completo (Tema 14). Con malos a, c, el período es una fracción ínfima de m.

«Cambio la semilla para alargar»

La semilla elige el punto de entrada, no el largo del anillo. El largo lo mandan a, c, m.

«Si N < p, todo bien»

Necesario pero no suficiente: estar dentro del ciclo no garantiza uniformidad ni independencia. Es piso, no techo.

«Con N chico ya medí el período»

Si N < p, nunca ves el cierre y subestimás. Para medir necesitás iterar hasta repetir o usar teoría.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: bueno vs. malo

Medí p de ambos con m = 32. ¿Cuál llega a 32?

def periodo(semilla, a, c, m):
    visto = {}
    x = semilla
    i = 0
    while x not in visto:
        visto[x] = i
        x = (a * x + c) % m
        i += 1
    return i - visto[x]


print(periodo(3, 13, 7, 32))
print(periodo(3, 4, 2, 32))
Ver solución razonada

El primero da 32 (completo); el segundo colapsa a un dígito. Misma m, destinos opuestos: mandan a y c.

Ejercicio 2: vueltas

Si p = 8 y N = 200, ¿cuántas vueltas das? ¿Cuántos valores distintos como máximo verás?

p, N = 8, 200
print("vueltas:", N / p)
print("distintos <=", min(p, N))
Ver solución

25 vueltas y como máximo 8 distintos: tu histograma tendrá 8 picos aunque N sea 200 o 2 millones.

Ejercicio 3: regla de oro

Tu simulación consume 5·10⁶ valores. Con criterio p > 1000·N, ¿qué p exigirías? ¿Alcanza un LCG de 2³¹?

Ver una posible respuesta
N = 5_000_000
print("p exigido:", 1000 * N)
print("p LCG 2**31:", 2**31 - 1)
print("alcanza:", (2**31 - 1) > 1000 * N)

No alcanza con ese criterio estricto: pedirías 5·10⁹ y el LCG da ~2,1·10⁹. Moraleja: para N millonarios se migra a generadores modernos (Tema 17).

09 · Síntesis

Ideas para recordar

  • Período = largo del ciclo que se repite; estado finito ⇒ ciclo inevitable.
  • Máximo teórico m (mixto) o m−1 (multiplicativo); el real depende de a y c.
  • Regla: N ≪ p; si N ≥ p, reciclás azar.
  • Con m chico se mide por diccionario; con m real se demuestra por teoría.
  • Período largo es piso, no garantía de calidad.

En el próximo tema viajaremos en el tiempo: la historia de los generadores pseudoaleatorios, de tablas y dados a Mersenne Twister.