Generación de Variables Aleatorias · Tema 23

Generación normal

La campana central de la simulación: tipificar con Z, ubicar con μ + σZ y validar 68-95-99,7.

01 · Punto de partida

Por qué todo error parece campana

¿Errores de medición? ¿Alturas, notas, ruidos? Cuando muchas causas chicas e independientes se suman, el resultado es N(μ,σ²): la campana de Gauss. Es el destino del teorema central del límite y el ruido por defecto del simulador.

Generarla es distinto a todo lo anterior: su CDF no tiene inversa cerrada, así que la suma de 12 uniformes la aproxima y Box-Muller (Tema 24) la produce exacta.

  • ¿Por qué basta generar Z ~ N(0,1) y luego μ + σZ?
  • ¿Qué dicen 68-95-99,7 y cómo auditan el generador?
  • ¿Por qué la inversa directa no es el camino?
  • ¿Cuándo la suma de 12 uniformes alcanza y cuándo no?

02 · Definición

Campana, tipificación y regla 68-95-99,7

Soporte (−∞,∞), simétrica en μ. Tipificar Z = (X−μ)/σ lleva cualquier normal a N(0,1). P(|Z| ≤ 1) ≈ 0,683, P(|Z| ≤ 2) ≈ 0,954, P(|Z| ≤ 3) ≈ 0,997.

μ+σZ

Ubicación-escala

μ traslada, σ ensancha. Generar la estándar y transformar es exacto: no hace falta un método por cada (μ,σ).

∑→∩

Suma que acampana

Promediar o sumar independientes converge a la campana (TCL). Sumar 12 U(0,1) y restar 6 aproxima N(0,1) con media 0 y var 1.

68·95·99

Huella digital

Las tres bandas son el test visual: si P(|Z|≤1) da 0,5 o 0,9 con N grande, el generador no es normal.

La misma campana estándar, tres ubicaciones.
CasoMediaDesvío σP(X en μ±σ)
N(0,1)0,01,0≈ 0,683
N(10,2)10,02,0≈ 0,683 en [8,12]
N(−3; 0,5)−3,00,5≈ 0,683 en [−3,5;−2,5]

03 · Anatomía

Suma aproximada, Box-Muller exacta

Suma de 12 uniformes O(12)
Z ≈ Σ₁₂Uᵢ − 6: media 0 y var 1 exactas, forma casi campana. Gasta 12 U por muestra y trunca la cola en ±6: útil para enseñar, no para colas.
Box-Muller exacta O(1)
Dos U producen dos N(0,1) con log, raíz y giro (Tema 24). Exacta hasta la cola: la opción por defecto en producción.
Polar sin trigonometría
Variante de Box-Muller que evita senos y cosenos con rechazo en el disco (Tema 25). Misma exactitud, mejor costo.
Colas que importan
La suma-12 nunca pasa de ±6 (P real ≈ 2e−9, despreciable salvo riesgo extremo). Para 3σ+ o Value-at-Risk, método exacto sí o sí.

Métodos exactos

Box-Muller y polar

Reproducen campana y colas con 1–2 U por normal. Los desarrollamos en los Temas 24 y 25.

Suma de uniformes

Aproximada y didáctica

Muestra el TCL en acción, pero recorta colas y gasta 12 U. Nunca para validar colas 3σ.

04 · Dónde suena la campana

Del error al modelo

U,U→Z ~ N(0,1)→μ + σZ
  1. 1
    Errores y medidas.

    Ruido de sensores, errores de medición, variaciones naturales alrededor de μ.

  2. 2
    Finanzas y riesgo.

    Retornos, VaR y bandas 2σ–3σ: aquí las colas exactas sí importan.

  3. 3
    Puente al muestreo.

    Base de normales multivariadas, correlacionadas y de procesos (Temas 28–29).

  4. 4
    Puente al límite.

    Binomial y Poisson con parámetros grandes ⇒ campana. (Temas 19, 20)

05 · Representación en Python

Suma-12 frente a gauss exacto

Mismos μ y σ: la aproximación didáctica contra random.gauss (exacto). Ambas deben calzar en media, desvío y banda 68 %.

Python en tu navegador. Llevá σ a 2 con μ = 10: la banda [8,12] debe rondar 0,683.

import random

random.seed(190)
mu, sigma, N = 0.0, 1.0, 8000

def normal_suma12(mu, sigma):
    z = sum(random.random() for _ in range(12)) - 6.0
    return mu + sigma * z

m1 = [normal_suma12(mu, sigma) for _ in range(N)]
random.seed(190)
m2 = [random.gauss(mu, sigma) for _ in range(N)]

def resumen(m):
    media = sum(m) / N
    var = sum((x - media) ** 2 for x in m) / N
    banda = sum(1 for x in m if abs(x - mu) <= sigma) / N
    return round(media, 3), round(var ** 0.5, 3), round(banda, 3)

print("suma12:", resumen(m1), "vs (0.0, 1.0, 0.683)")
print("gauss: ", resumen(m2), "vs (0.0, 1.0, 0.683)")

Ambas rondan media 0, desvío 1 y banda 0,683. La diferencia aparece en la cola ±4σ: suma-12 jamás llega.

06 · Exploración

Laboratorio: campana que se muda y se ensancha

Movete μ y σ con N fijo. El histograma usa 25 bines en μ ± 4σ; los rombos son la probabilidad teórica por bin. La curva se traslada con μ y se achata con σ.

EXPERIMENTO 23

Campana N(μ,σ)

X = μ + σ·Z, Z ~ N(0,1)

Los resultados numéricos aparecen debajo.
Media muestral0,000
Teórica μ0,000
Desvío muestral1,000
Banda μ±σ0,683

Con μ 0, σ 1 y N 6000, banda ≈ 0,683.

25 bines en μ ± 4σ. Probá σ = 2,5 (chata) y μ = 3 (trasladada).

Preguntas para explorar

  1. Con μ = 0 y σ = 1, ¿media, desvío y banda teóricas?
  2. Duplicá σ a 2. ¿La campana se achata a la mitad de altura? ¿La banda sigue en 0,683?
  3. Mové μ a 3 con σ = 1. ¿Cambia la forma o solo la ubicación?
Ver respuestas sugeridas
  1. Media 0, desvío 1 y banda 0,683.
  2. Sí: la altura central cae como 1/σ y el ancho crece como σ; la banda tipificada no depende de σ.
  3. Solo la ubicación: N(3,1) es N(0,1) trasladada, misma forma y misma banda.

07 · Comprensión

Confusiones frecuentes

«Normal es lo mismo que uniforme reescalada»

No: la planicie reparte parejo, la campana concentra 68 % en ±σ. La banda μ±σ las distingue sin piedad.

«La suma-12 es exacta»

Es aproximada y trunca en ±6. Para colas 3σ+ o riesgo, Box-Muller o polar (Temas 24–25).

«σ y σ² son intercambiables»

X = μ + σZ usa el desvío σ, no la varianza. Pasar σ² donde va σ ensancha al cuadrado.

«Con N = 200 la banda debe dar 0,683»

La banda tiene ruido ±√[0,68·0,32/200] ≈ ±0,033. Validar bandas con miles, no con cientos.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: sensores con N(10,2)

μ = 10, σ = 2, N = 8000 (semilla 191): verificá media ≈ 10, desvío ≈ 2 y banda [8,12] ≈ 0,683.

import random

random.seed(191)
mu, sigma, N = 10.0, 2.0, 8000
m = [random.gauss(mu, sigma) for _ in range(N)]
media = sum(m) / N
print(round(media, 3), "vs 10.0")
print(round((sum((x-media)**2 for x in m)/N) ** 0.5, 3), "vs 2.0")
print(round(sum(1 for x in m if abs(x-mu) <= sigma) / N, 3), "vs 0.683")
Ver solución razonada

≈ 10,0, ≈ 2,0 y ≈ 0,68 (típicamente 0,67–0,70). Si la banda da ≈ 0,5, estás generando uniforme o Laplace.

Ejercicio 2: colas 2σ y 3σ

Con Z ~ N(0,1) y N = 20000, estimá P(|Z| ≤ 2) ≈ 0,954 y P(|Z| ≤ 3) ≈ 0,997.

import random

random.seed(192)
N = 20000
m = [random.gauss(0, 1) for _ in range(N)]
print(round(sum(1 for x in m if abs(x) <= 2) / N, 3), "vs 0.954")
print(round(sum(1 for x in m if abs(x) <= 3) / N, 3), "vs 0.997")
Ver solución

≈ 0,954 y ≈ 0,997. La cola 3σ necesita N = 20000: apenas ~60 puntos caen fuera de ±3.

Ejercicio 3: la suma-12 se queda sin cola

Compará el máximo absoluto de suma-12 contra gauss con N = 5000: la primera jamás pasa de 6.

Ver una posible respuesta
import random

random.seed(193)
N = 5000
s12 = [sum(random.random() for _ in range(12)) - 6.0 for _ in range(N)]
random.seed(193)
g = [random.gauss(0, 1) for _ in range(N)]
print("máx |suma12|:", round(max(abs(x) for x in s12), 2), "(tope 6.0)")
print("máx |gauss|:", round(max(abs(x) for x in g), 2))

Suma-12 acotada en 6 por construcción; gauss a veces supera 3,5–4 con N = 5000. Para colas extremas, método exacto.

09 · Síntesis

Ideas para recordar

  • N(μ,σ²) = μ + σZ con Z ~ N(0,1): generar la estándar alcanza.
  • Huella 68-95-99,7 para auditar campana y colas.
  • Sin inversa cerrada: suma-12 aproxima, Box-Muller/polar generan exacto.
  • No confundir σ con σ² ni campana con planicie.
  • Límite de binomial y Poisson con parámetros grandes.

En el próximo tema generamos la estándar exacta: Box-Muller con dos uniformes.