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).
| Propiedad | Chequeo rápido | Valor esperado en U(0,1) |
|---|---|---|
| Uniformidad | Media e histograma | Media ≈ 0,5 · varianza ≈ 1/12 ≈ 0,0833 |
| Independencia | Correlación lag-1 | ≈ 0 (ni 1 ni −1) |
| Período | Estados distintos / N | Perí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:
- 1Bueno didáctico.
x(n+1) = (13·x(n)+7) mod 64: período 64 completo, histograma parejo, vecinos sin forma. - 2Malo 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. - 3Moraleja.
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.
El promedio miente, el histograma no
bueno (13,7,64) vs. malo (4,2,64)
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
- Con N = 64, ¿el bueno llena los 8 bins? ¿Y el malo cuántos bins deja vacíos?
- Subí a N = 2048: ¿el malo «mejora» o los huecos se confirman? ¿Por qué más N no cura un mal generador?
- Si solo miraras la media, ¿detectarías al malo? ¿Qué métrica lo delata primero?
Ver respuestas sugeridas
- El bueno reparte ~8 por bin; el malo concentra en pocos y deja vacíos la mayoría.
- Se confirman: más N solo llena más los mismos picos. El defecto es estructural, no muestral.
- 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.