Generación de Variables Aleatorias · Tema 22

Generación exponencial

Tiempos entre eventos con −ln(U)/λ: inversión exacta, falta de memoria y media 1/λ.

01 · Punto de partida

Cuánto falta para lo próximo

¿Cuánto hasta la próxima llamada, la próxima falla, el próximo cliente? Si los eventos llegan con tasa λ y sin agenda, la espera es Exp(λ): la única continua sin memoria.

Es la primera inversa continua no lineal del curso y el reloj del proceso de Poisson del Tema 20: contar eventos o medir esperas son dos caras del mismo λ.

  • ¿Por qué −ln(1−U)/λ es exacto?
  • ¿Qué significa “sin memoria” en una espera simulada?
  • ¿Qué media y varianza debe reproducir la muestra?
  • ¿Qué rompe la fórmula en flotante?

02 · Definición

Densidad que cae y cola sin memoria

Soporte [0,∞). F(x) = 1 − e^(−λx), P(X > x) = e^(−λx). E[X] = 1/λ, Var(X) = 1/λ², mediana ln 2/λ. Falta de memoria: P(X > s+t | X > s) = P(X > t).

−ln

Inversa exacta

Despejar 1 − e^(−λx) = u da x = −ln(1−u)/λ. Un U, un log: O(1) sin rechazo.

∅

Sin memoria

Lo ya esperado no descuenta: la cola condicional es igual a la original. En código, el reloj se reinicia solo.

λ↔1/λ

Tasa y escala

λ es tasa (eventos por unidad); 1/λ es escala (espera media). Duplicar λ parte la espera a la mitad.

Misma fórmula, distinta tasa: la escala manda.
CasoMedia 1/λVarianzaP(X > media)
Exp(0,5)2,004,00e^(−1) ≈ 0,368
Exp(1)1,001,00≈ 0,368
Exp(2)0,500,25≈ 0,368

03 · Anatomía

Fórmula, bordes y estabilidad

Inversión O(1)
Un uniforme y un logaritmo por muestra. Precomputar 1/λ fuera del bucle si λ es fijo.
1−U vs U
En distribución, −ln(U)/λ y −ln(1−U)/λ son iguales; numéricamente conviene -log1p(-u) o -log(u) con u ∈ (0,1] para no perder precisión con u ≈ 1.
Bordes U = 0 / U = 1
U = 0 da x = 0 (válido); U = 1 da −ln(0) = ∞. Si el generador base puede devolver 1,0 exacto, clampear a 1 − 1e−12 o rechazarlo.
Sumas que escalan
Sumar k exponenciales iid da Erlang(k,λ), antesala de la gamma (Tema 26). Con λ chica la cola se alarga: graficar truncado + cola “≥K”.

Inversión logarítmica

Exacta y barata

La opción por defecto: un U por muestra, sin tablas ni rechazo, válida para todo λ > 0.

Atajos aproximados

Sesgan la cola

Truncar, discretizar o usar 1/λ · U aplana la caída exponencial. La cola delata el truco con N grande.

04 · Dónde espera la exponencial

Del reloj al sistema

U(0,1)→−ln(U)/λ→Exp(λ)
  1. 1
    Colas y llegadas.

    Interarribos y servicios con tasa λ: el motor del simulador de colas.

  2. 2
    Confiabilidad.

    Vida útil con tasa de falla constante: P(sobrevivir > t) = e^(−λt).

  3. 3
    Puente a Poisson.

    Contar cuántas Exp(λ) entran en [0,1] da Poisson(λ). Reloj y conteo unidos. (Tema 20)

  4. 4
    Puente a gamma.

    Sumar k exponenciales da Erlang; con forma no entera, gamma. (Tema 26)

05 · Representación en Python

Inversa y auditoría de dos momentos

Una función, un vector y dos asserts: media 1/λ y varianza 1/λ², más la cola P(X > media) ≈ 0,368.

Python en tu navegador. Llevá λ a 2: la media debe caer a 0,5.

import random
import math

random.seed(180)
lam, N = 0.5, 8000
inv_lam = 1.0 / lam

def exponencial(lam):
    return -math.log(1 - random.random()) / lam

m = [exponencial(lam) for _ in range(N)]
media = sum(m) / N
var = sum((x - media) ** 2 for x in m) / N
print("media:", round(media, 3), "teórica:", inv_lam)
print("var:", round(var, 3), "teórica:", round(inv_lam ** 2, 3))
print("P(X > media):", round(sum(1 for x in m if x > inv_lam) / N, 3), "vs 0.368")

Media ≈ 2,0, var ≈ 4,0 y cola ≈ 0,368. Si la cola da ≈ 0,5, estás generando uniforme, no exponencial.

06 · Exploración

Laboratorio: caída que escala con λ

Movete λ con N fijo. El histograma usa 20 bines hasta el cuantil 99,5 % (cola ≥ resto aparte); los rombos son la probabilidad teórica por bin. Con λ chica la cola se estira; con λ grande se comprime.

EXPERIMENTO 22

Exponencial por inversión

X = −ln(1 − U) / λ

Los resultados numéricos aparecen debajo.
Media muestral2,000
Teórica 1/λ2,000
Var. muestral4,000
Teórica 1/λ²4,000

Con λ 0,5 y N 6000, media 2,0 y var 4,0.

20 bines hasta el cuantil 99,5 % más cola. Probá λ = 0,2 (cola larguísima) y λ = 3 (caída rápida).

Preguntas para explorar

  1. Con λ = 0,5, ¿media y varianza teóricas? Leelas en el panel.
  2. Duplicá λ a 1,0. ¿La media se parte a la mitad? ¿Y la varianza a la cuarta parte?
  3. Con λ = 0,2 y N = 500, ¿la cola se estima bien? ¿Por qué necesita N grande?
Ver respuestas sugeridas
  1. Media 2,0 y varianza 4,0.
  2. Sí: 1/λ pasa de 2 a 1 y 1/λ² de 4 a 1. Escalar λ comprime toda la distribución.
  3. No: la cola e^(−λx) con λ chica llega lejos y cada bin lejano tiene pocos puntos; solo N grande la llena.

07 · Comprensión

Confusiones frecuentes

«Exponencial de media λ»

La media es 1/λ, no λ. Parametrizar al revés invierte todas las esperas: con λ = 0,5 la media es 2, no 0,5.

«U y 1−U dan distinta calidad»

En distribución son idénticas; solo cambia la estabilidad numérica cerca de 1. La calidad la da el generador base.

«Sin memoria significa sin historia del sistema»

Solo de esa espera: P(X>s+t|X>s) = P(X>t). El sistema (cola, stock) sí acumula historia.

«Con N = 200 la varianza debe calzar»

La exponencial tiene cola pesada: la varianza muestral fluctúa mucho con N chico. Validar con miles.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: call center con λ = 2

λ = 2 por minuto, N = 8000 (semilla 181): estimá media (≈ 0,5), varianza (≈ 0,25) y P(X > 1) (≈ e^(−2) ≈ 0,135).

import random
import math

random.seed(181)
lam, N = 2.0, 8000
m = [-math.log(1 - random.random()) / lam for _ in range(N)]
media = sum(m) / N
print(round(media, 3), "vs 0.5")
print(round(sum((x-media)**2 for x in m)/N, 3), "vs 0.25")
print(round(sum(1 for x in m if x > 1) / N, 3), "vs", round(math.exp(-2), 3))
Ver solución razonada

≈ 0,5, ≈ 0,25 y ≈ 0,135 (típicamente 0,12–0,15). Si la media da ≈ 2, invertiste λ con 1/λ.

Ejercicio 2: falta de memoria en código

Con λ = 1 y N = 10000, verificá que P(X > 3 | X > 1) ≈ P(X > 2) ≈ e^(−2).

import random
import math

random.seed(182)
lam, N = 1.0, 10000
m = [-math.log(1 - random.random()) / lam for _ in range(N)]
cond = [x for x in m if x > 1]
print(round(sum(1 for x in cond if x > 3) / len(cond), 3), "vs", round(math.exp(-2), 3))
Ver solución

Ambos ≈ 0,135. Lo ya esperado (1) no descuenta: la cola desde 1 se comporta como nueva.

Ejercicio 3: de exponenciales a Poisson

Con λ = 3, sumá interarribos hasta superar 1 y contá eventos: debe dar Poisson(3) con media ≈ 3.

Ver una posible respuesta
import random
import math

random.seed(183)
lam, N = 3.0, 3000
conteos = []
for _ in range(N):
    t, k = 0.0, 0
    while True:
        t += -math.log(1 - random.random()) / lam
        if t > 1.0:
            conteos.append(k)
            break
        k += 1
print(round(sum(conteos) / N, 3), "vs 3.0")

Media ≈ 3,0. Es el puente Exp ↔ Poisson: reloj y conteo con el mismo λ.

09 · Síntesis

Ideas para recordar

  • Exp(λ) = −ln(1−U)/λ: inversión exacta O(1).
  • Media 1/λ, varianza 1/λ², cola P(X>x) = e^(−λx).
  • Única continua sin memoria, como la geométrica discreta.
  • Cuidar U = 1 (log de 0) y usar log1p cerca del borde.
  • Reloj de Poisson y ladrillo de Erlang/gamma.

En el próximo tema apilamos simetría: la normal, campana central de la simulación.