01 · Punto de partida
Si podés sortear F, no inventes otra
Muestreo directo es sortear exactamente de la distribución objetivo: exponenciales con logaritmo, normales con Box-Muller o gauss, discretas con cortes. Sin pesos, sin correcciones, sin rechazos.
Es la referencia contra la que se miden importance sampling y rechazos: simple, insesgado y con varianza mínima para ese estimador.
- ¿Tiene mi F inversa cerrada?
- ¿Hay función lista en
random? - ¿El directo es barato por réplica?
- ¿Cuándo deja de alcanzar?
02 · Definición
Tres directos que cubren el 90%
Inversa cerrada
Exponencial, uniforme, discreta: X = F⁻¹(U) con una línea.
Construida
Normal por Box-Muller o suma: dos U hacen una campana.
De librería
uniform, randint, choices, gauss, expovariate: directo ya probado.
| F objetivo | Receta | Código |
|---|---|---|
| U(a,b) | a + (b−a)U | random.uniform(a, b) |
| Exponencial(λ) | −ln(1−U)/λ | random.expovariate(lam) |
| Normal(μ,σ) | Box-Muller | random.gauss(mu, sigma) |
| Discreta con pesos | Cortes acumulados | random.choices(v, weights) |
| Bernoulli(p) | U < p | random.random() < p |
03 · Cuándo alcanza y cuándo no
- 1Si hay inversa o librería.
Directo: una línea por muestra, varianza base.
- 2Si F es rara o truncada.
Directo con cortes o con normal truncada a mano.
- 3Si el evento es raro o f pica.
El directo desperdicia: pasar a importance sampling (tema 24).
Directo gana
Medias y cuerpos
Estimating E[X], áreas centrales, integrales suaves: simple e imbatible.
Directo pierde
Colas raras
P(X > 5) con N = 1 000 da 0 casos: sin muestras no hay estimación.
04 · Ejemplos
Directos de todos los días
- 1Tiempo entre fallas Exp(0,5).
Media 2:
−ln(1−U)/0.5. - 2Costo N(100,15).
gauss(100, 15)truncado en 0. - 3Demanda 30/40/30.
Cortes 0,3/0,7 con un U.
05 · Representación en Python
Directo a mano y de librería
Python en tu navegador. La versión a mano enseña; la de librería produce.
import random
import math
def exp_manual(lam):
return -math.log(1 - random.random()) / lam
N = 10000
lam = 0.5
m1 = sum(exp_manual(lam) for _ in range(N)) / N
m2 = sum(random.expovariate(lam) for _ in range(N)) / N
print("manual:", round(m1, 3), "librería:", round(m2, 3), "(teórico 2.0)")
import random
# Normal por Box-Muller a mano (una muestra)
import math
def normal_manual(mu=0, sigma=1):
u1, u2 = random.random(), random.random()
z = math.sqrt(-2*math.log(u1)) * math.cos(2*math.pi*u2)
return mu + sigma*z
print(round(sum(normal_manual(100, 15) for _ in range(5000)) / 5000, 2))
06 · Exploración
Laboratorio: la exponencial sale del logaritmo
Sorteamos Exp(λ) con −ln(1−U)/λ. El histograma debe copiar la curva teórica λe^(−λx) y la media pegarse a 1/λ.
Directo que se verifica solo
X = −ln(1−U)/λ
Tocá «Sortear» para muestrear.
Barras: tu muestra. Curva blanca: teoría. Con λ chico la cola es larga; con λ grande se aprieta a 0.
Preguntas para explorar
- Con λ = 0,5, ¿la media ronda 2? ¿Y con λ = 2?
- ¿Por qué P(X > 5) con λ = 2 y N = 500 suele dar 0?
- ¿Qué harías si necesitaras esa cola rara?
Ver respuestas sugeridas
- Sí: 1/0,5 = 2 y 1/2 = 0,5. El directo es fiel.
- La real es e^(−10) ≈ 0,00005: con 500 no cae ni uno. Directo desperdicia.
- Importance sampling (tema 24): muestrear donde está la cola y ponderar.
07 · Comprensión
Confusiones frecuentes
«Directo es siempre lo mejor»
Es lo más simple, no lo más eficiente: en colas raras casi no muestrea lo que importa.
«gauss da exacto»
Da muestras exactas de la normal, no el valor exacto: el promedio sigue temblando 1/√N.
«Inversa aproximada vale»
Solo si el error numérico es menor que tu e. Cerca de u = 1 el logaritmo es delicado.
«Todo tiene inversa cerrada»
No: muchas F piden numérica, rechazo o MCMC. El directo cubre lo común, no todo.
08 · Práctica guiada
Ejercicios con Python
Ejercicio 1: exponencial fiel
Con λ = 1 y N = 10 000, verificá media ~1.
import random
lam, N = 1.0, 10000
print(sum(random.expovariate(lam) for _ in range(N)) / N)
Ver solución razonada
~1,00 ± 0,01. El directo de librería es la referencia.
Ejercicio 2: normal truncada
Costos N(100,15) sin negativos: truncá en 0 y compará la media.
import random
N = 10000
cs = [max(0, random.gauss(100, 15)) for _ in range(N)]
print(sum(cs) / N)
Ver solución
~100,0: truncar en 0 casi no mueve la media porque P(<0) es minúscula.
Ejercicio 3: detectar el límite
Estimá P(Exp(1) > 8) con N = 5 000 directo. ¿Qué ves?
Ver una posible respuesta
import random
N = 5000
print(sum(1 for _ in range(N) if random.expovariate(1) > 8) / N)
Casi siempre 0 (real ≈ 0,0003). El directo no ve colas raras: pide importance sampling.
09 · Síntesis
Ideas para recordar
- Directo = sortear de F con F⁻¹(U) o librería: promedio simple.
- Cubre uniforme, exponencial, normal, discretas y Bernoulli.
- Es la referencia: simple, insesgado, varianza base.
- Falla en colas raras: sin muestras no hay estimación.
- En producción, librería; a mano solo para aprender.
En el próximo tema sortearemos donde importa: Importance Sampling.