Números Pseudoaleatorios · Tema 07

Propiedades deseables de un generador

Qué le exigimos antes de confiar: uniformidad, independencia, período largo, velocidad y reproducibilidad —y cómo oler a simple vista al generador malo.

01 · Punto de partida

De «genera números» a «genera confianza»

Cualquier fórmula escupe números. La pregunta del Tema 6 fue ¿puedo repetirlos?; la de hoy es ¿puedo creerles? Un generador pobre sesga promedios, inventa correlaciones y repite ciclos sin avisarte, y tu simulación hereda cada defecto (Tema 44).

Por suerte no hay que creer por fe: hay propiedades exigibles y chequeos rápidos que separan lo usable de lo tramposo antes de entrar en pruebas formales (Temas 26–32).

  • ¿Qué 5 propiedades definen un buen generador?
  • ¿Por qué media 0,5 no alcanza para declarar uniformidad?
  • ¿Cómo se huele correlación y período corto con poco código?
  • ¿Qué compensaciones hay entre velocidad, calidad y seguridad?

02 · Definición

Las cinco exigencias

◈

Uniformidad

Cada subintervalo de [0,1) recibe su parte justa: en 1000 valores, cada décimo espera ~100. Es el Tema 8.

⇄

Independencia

Conocer u(n) no ayuda a adivinar u(n+1): sin rachas obligadas ni alternancias. Es el Tema 9.

▣

Período largo

El ciclo debe superar ampliamente tu N: si simulás millones, un período de miles es un loop disfrazado. Es el Tema 10.

A esas tres se suman dos prácticas, sin las cuales ni el mejor estadístico sirve:

Eficiencia
Millones de valores por segundo con poca memoria. Un generador perfecto pero lentísimo no se usa (y uno rapidísimo pero sesgado tampoco).
Reproducibilidad y portabilidad
Misma semilla, misma secuencia en cualquier máquina y lenguaje, con parámetros documentados. Sin esto no hay ciencia (Tema 6).
Qué mirar y con qué número.
PropiedadChequeo rápidoValor esperado en U(0,1)
UniformidadMedia e histogramaMedia ≈ 0,5 · varianza ≈ 1/12 ≈ 0,0833
IndependenciaCorrelación lag-1≈ 0 (ni 1 ni −1)
PeríodoEstados distintos / NPeríodo ≫ N, sin repetición en tu ventana

03 · Olfato

Cómo oler un generador malo en un minuto

Antes de los tests formales, tres olfatos con 10 líneas:

Histograma plano
Dividí [0,1) en 10 bins y contá: todos deben rondar N/10. Un bin vacío o doble delata sesgo grosero.
Nube sin forma
Graficá pares (u(n), u(n+1)): deben llenar el cuadrado sin diagonales, bandas ni rejillas. Una diagonal es correlación total.
Sin repetición prematura
Contá estados distintos en N: si N = 200 y solo hay 8 distintos, el período es un chiste.

Generador sano

Aburrido a ojo

Histograma parejo, nube informe, media 0,5 y correlación cercana a 0. Lo aburrido es bueno.

Generador enfermo

Interesante a ojo

Picos, diagonales, ciclos visibles. Todo «patrón interesante» en azar es síntoma.

04 · Ejemplos

Bueno y malo con la misma cara

Con módulo 64 ambos generan «decimales entre 0 y 1» y promedian ~0,5 en N chico. La diferencia aparece al exigir:

Histograma→Vecinos→Período
  1. 1
    Bueno didáctico.

    x(n+1) = (13·x(n)+7) mod 64: período 64 completo, histograma parejo, vecinos sin forma.

  2. 2
    Malo didáctico.

    x(n+1) = (4·x(n)+2) mod 64: ciclo de ~8, bins vacíos, correlación brutal. Promedia «bien» y miente igual.

  3. 3
    Moraleja.

    El promedio no distingue; el histograma + vecinos + período sí. Por eso se exigen las tres.

05 · Chequeo en Python

Tres números que delatan

Media, varianza y correlación lag-1 en 20 líneas: tu kit de olfato desde hoy hasta el Tema 32.

Python en tu navegador. Probá con random (sano) y con el malo didáctico para calibrar el olfato.

import random

random.seed(11)
vals = [random.random() for _ in range(2000)]
media = sum(vals) / len(vals)
var = sum((v - media) ** 2 for v in vals) / len(vals)
print("media:", round(media, 4), "(esperado 0,5)")
print("var:", round(var, 4), "(esperado 0,0833)")

Con 2000 valores sanos, media 0,48–0,52 y varianza 0,078–0,088 son normales. Fuera de ahí, sospechá.

Correlación con el vecino

Si saber u(n) te dice algo de u(n+1), hay dependencia. Cerca de 0 es sano; cerca de ±1 es alarma:

def corr_lag1(vals):
    n = len(vals)
    m = sum(vals) / n
    num = sum((vals[i] - m) * (vals[i + 1] - m) for i in range(n - 1))
    den = sum((v - m) ** 2 for v in vals)
    return num / den if den else 0


malo = []
x = 7
for _ in range(2000):
    x = (4 * x + 2) % 64
    malo.append(x / 64)
print("corr mala:", round(corr_lag1(malo), 4))

06 · Exploración

Laboratorio: radar bueno vs. malo

Elegí el generador y N. El canvas muestra el histograma en 8 bins (línea punteada = altura ideal N/8). El panel calcula media, correlación lag-1 y estados distintos.

EXPERIMENTO 07

El promedio miente, el histograma no

bueno (13,7,64) vs. malo (4,2,64)

Los resultados numéricos aparecen debajo.
Media—
Corr lag-1—
Distintos / N—
Veredicto—

Con N = 512 el malo muestra bins vacíos.

Barras parejas = uniformidad; barras con huecos = sesgo grosero aunque la media parezca razonable.

Preguntas para explorar

  1. Con N = 64, ¿el bueno llena los 8 bins? ¿Y el malo cuántos bins deja vacíos?
  2. Subí a N = 2048: ¿el malo «mejora» o los huecos se confirman? ¿Por qué más N no cura un mal generador?
  3. Si solo miraras la media, ¿detectarías al malo? ¿Qué métrica lo delata primero?
Ver respuestas sugeridas
  1. El bueno reparte ~8 por bin; el malo concentra en pocos y deja vacíos la mayoría.
  2. Se confirman: más N solo llena más los mismos picos. El defecto es estructural, no muestral.
  3. No: la media puede dar 0,5 igual. Lo delatan el histograma, los distintos/N y la correlación.

07 · Comprensión

Confusiones frecuentes

«Media 0,5 = uniforme»

La constante 0,5 y la alternancia 0/1 promedian 0,5 y son pésimas. Uniformidad es reparto por intervalos, no promedio.

«Período largo = bueno»

Necesario pero insuficiente: hay generadores de período enorme con correlación grosera entre vecinos. Largo sin uniforme e independiente no sirve.

«Rápido y moderno = confiable»

La velocidad no certifica. Solo certifican teoría de parámetros + batería de pruebas + reproducibilidad documentada.

«Pasó un test, listo para todo»

Cada test mira un defecto: pasar frecuencia y fallar series es típico. Se exige batería, no un test suelto (Temas 26–32).

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: media y varianza del bueno

Generá 2000 valores del bueno didáctico y verificá media y varianza contra 0,5 y 1/12.

def gen(semilla, a, c, m, n):
    x = semilla
    sal = []
    for _ in range(n):
        x = (a * x + c) % m
        sal.append(x / m)
    return sal


v = gen(7, 13, 7, 64, 2000)
m = sum(v) / len(v)
var = sum((x - m) ** 2 for x in v) / len(v)
print(round(m, 4), round(var, 4))
Ver solución razonada

Deberías rondar 0,5 y 0,083. Si te da eso pero el histograma tiene huecos con otro generador, ya sabés que media no basta.

Ejercicio 2: histograma en 8 bins

Contá cuántos caen en cada octavo de [0,1) para el bueno y el malo con N = 640. ¿Cuál deja bins vacíos?

def hist(semilla, a, c, m, n, k=8):
    x = semilla
    bins = [0] * k
    for _ in range(n):
        x = (a * x + c) % m
        bins[int((x / m) * k)] += 1
    return bins


print("bueno:", hist(7, 13, 7, 64, 640))
print("malo:", hist(7, 4, 2, 64, 640))
Ver solución

El bueno ronda 80 por bin; el malo concentra todo en 1–2 bins y deja 6–7 en cero. Esa es la foto de la no-uniformidad.

Ejercicio 3: correlación del malo

Calculá la correlación lag-1 de ambos y compará con 0. ¿Cuál se acerca a ±1?

Ver una posible respuesta
def corr(v):
    m = sum(v) / len(v)
    num = sum((v[i] - m) * (v[i + 1] - m) for i in range(len(v) - 1))
    den = sum((x - m) ** 2 for x in v)
    return num / den


def gen(semilla, a, c, m, n):
    x = semilla
    sal = []
    for _ in range(n):
        x = (a * x + c) % m
        sal.append(x / m)
    return sal


print("bueno:", round(corr(gen(7, 13, 7, 64, 2000)), 4))
print("malo:", round(corr(gen(7, 4, 2, 64, 2000)), 4))

El bueno ronda 0 (±0,1 con N = 2000); el malo se dispara. Es el anticipo numérico del Tema 32.

09 · Síntesis

Ideas para recordar

  • Buen generador = uniforme + independiente + período ≫ N + rápido + reproducible.
  • Media 0,5 no prueba uniformidad; período largo no prueba independencia.
  • El olfato rápido es histograma + nube de pares + distintos/N.
  • Pasar un test no certifica: se exige batería.
  • Lo «interesante a ojo» en azar es síntoma, no virtud.

En los próximos tres temas abriremos cada exigencia: uniformidad, independencia y período de un generador.