Generación de Variables Aleatorias · Tema 40

Selección del método

Precisión, velocidad y simplicidad según el caso: el árbol que convierte el curso en decisiones.

01 · Punto de partida

El curso entero en una pregunta

“Necesito Poisson(200) diez millones de veces” / “Binomial(10, 0,5) cien veces” / “Normales para un VaR”. Tres pedidos, tres respuestas distintas —y todas están en los Temas 16–27. Este tema ordena ese arsenal en un árbol de decisión de tres ejes: precisión (¿exacto o aproximado?), velocidad (¿N chico o enorme?) y simplicidad (¿quién mantiene el código?).

La regla de oro anticipada: el método más simple que respete F con el costo que tu N permite.

  • ¿Cuándo una aproximación es legítima y cuándo es bug?
  • ¿Cómo pesan N, las colas y el hardware en la balanza?
  • ¿Qué vale la simplicidad frente al récord de velocidad?
  • ¿Cómo se documenta la decisión?

02 · Definición

Tres ejes, un orden

Precisión: exacto (igualdad en ley) vs aproximado (TCL, redondeos) — las colas y el riesgo vetan aproximaciones. Velocidad: setup + N·marginal con tu hardware (Tema 39). Simplicidad: líneas, dependencias y probabilidad de bug al releer.

✓exacto

Precisión filtra

Si las colas importan (VaR, riesgo, 3σ+), solo métodos exactos. La aproximación normal con λ = 5 no se discute: se descarta.

N×costo

Velocidad ordena

Entre los exactos que pasan, gana el de menor total con tu N: suma con n = 10, tabla con n = 1000.

leer

Simplicidad desempata

A igual precisión y costo similar, el código que se entiende en un minuto vale más que el 10 % más rápido que nadie toca.

El curso resumido en recomendaciones.
CasoMétodoPor qué
Bin(10; 0,5) ×100Suma BernoulliExacta y trivial; el setup no se paga
Poisson(200) ×10⁷Rechazo/normalKnuth gastaría ~201 U por muestra
N(0,1) para VaRBox-Muller/polarColas exactas; suma-12 prohibida

03 · Anatomía

Preguntas que deciden

¿Las colas importan?
Sí (riesgo, extremos, 3σ+) ⇒ solo exactos: Box-Muller, inversión, Knuth con λ moderada. No ⇒ aproximaciones TCL y redondeos entran a la cancha.
¿Cuánto vale N?
N ≤ 10³: simplicidad manda (sumas, bucles). N ≥ 10⁶: el setup se amortiza (alias, tablas, ziggurat) y cada U cuenta.
¿Discreta finita con N enorme?
Alias (Temas 13–14): O(n) una vez, O(1) siempre. El caso de dados online y bootstrap masivo.
¿Sin modelo teórico?
Empírica discreta (Tema 34) u histograma k ≈ Sturges (Tema 35): la precisión se juzga con KS contra los datos, no contra una F.

Decidir con árbol

Auditable y repetible

La elección queda documentada con sus supuestos: otro programador la puede revisar y refutar.

Elegir por costumbre

“Siempre usé este”

El método favorito fuera de su rango (Knuth con λ = 200, suma-12 para VaR) es deuda con intereses.

04 · Dónde se decide

Del pedido a la firma

pedido→árbol→método + tests
  1. 1
    Simulación masiva.

    Millones de réplicas: el marginal manda y el setup se vuelve invisible.

  2. 2
    Riesgo y colas.

    La precisión veta primero: exactos con colas reales aunque cuesten más.

  3. 3
    Prototipos.

    N chico y deadline: suma, bucles y librería directa, bien validados.

  4. 4
    Puente a la biblioteca.

    Cada decisión documentada se vuelve un módulo del proyecto final. (Tema 41)

05 · Representación en Python

El árbol en código

Función que recomienda con las reglas del tema: colas vetan, N ordena, simplicidad desempata.

Python en tu navegador. Pedí Poisson(200) con colas: el árbol debe vetar a Knuth.

def recomendar(familia, par, N, colas=False):
    if familia == "binomial":
        n = par
        if n <= 30:
            return "suma Bernoulli (%d U)" % n
        return "inversión por tabla (1 U, setup O(n))"
    if familia == "poisson":
        lam = par
        if lam <= 20:
            return "Knuth (%.0f U)" % (lam + 1)
        if colas:
            return "rechazo PTRS (exacto, O(1))"
        return "normal N(λ,λ) (aprox, O(1))"
    if familia == "normal":
        if colas:
            return "Box-Muller/polar (exacto, ~1 U)"
        return "Box-Muller/polar (exacto, ~1 U)"
    return "empírica/histograma (Temas 34-35)"

print(recomendar("binomial", 10, 100))
print(recomendar("poisson", 200, 10**7))
print(recomendar("poisson", 200, 10**7, colas=True))
print(recomendar("normal", 0, 10**6, colas=True))

Suma, normal-aprox, PTRS y Box-Muller: el árbol habla con los números del curso.

06 · Exploración

Laboratorio: el recomendador

Elegí familia, tamaño y si las colas importan: las barras comparan U por muestra de los candidatos y el panel firma el ganador con su razón. Jugá a contradecirlo con casos borde.

EXPERIMENTO 40

Recomendador

colas vetan · N ordena · simple desempata

Los resultados numéricos aparecen debajo.
Ganador—
U / muestra—
Setup—
Razón—

Elegí un caso para ver la recomendación.

Barras logarítmicas de U/muestra; el verde es el recomendado. Probá Poisson sin colas.

Preguntas para explorar

  1. Con Binomial y N = 100, ¿gana la suma? ¿Por qué el setup la condena con N chico?
  2. Poisson λ = 200 con colas: ¿PTRS sobre normal? ¿Sin colas?
  3. Normal para VaR sin colas marcadas: ¿sigue ganando Box-Muller? ¿Por qué suma-12 nunca?
Ver respuestas sugeridas
  1. Sí: 50 U × 100 = 5000 U totales; la tabla pagaría setup O(50) para ahorrar poco.
  2. Con colas PTRS (exacto); sin colas la normal N(200,200) redondeada (la más barata).
  3. Sí: ~1 U contra 12 U con igual exactitud; suma-12 pierde siempre en costo y en colas.

07 · Comprensión

Confusiones frecuentes

«Aproximado vale si N es grande»

Al revés: con N grande el error de aproximación se vuelve detectable y sistemático. N grande exige exactitud, no la perdona.

«El más rápido siempre»

Solo entre los que pasan precisión y validación. El ranking de velocidad corre después del filtro, nunca antes.

«Setup despreciable siempre»

Con N = 100, un setup O(10⁴) domina el total. Amortizar exige N ≫ setup/marginal.

«Documentar es burocracia»

Sin (método, supuestos, tests) nadie puede refutar ni mantener la elección: es deuda, no velocidad.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: dados online millonarios

U{1…6} con N = 10⁹ por día: ¿piso directo o alias? Justificá con setup y marginal.

N = 10**9
print("piso: setup 0, marginal 1 U → total", N)
print("alias: setup O(6), marginal 1 U + 1 int → total ~", N)
Ver solución razonada

Empate técnico: con n = 6 el piso 1+int(6U) ya es O(1) sin setup. Alias recién paga con n grande o pesos desiguales.

Ejercicio 2: reintentos con p = 0,001

Geométrica hasta el primer éxito, N = 10⁵: ¿bucle Bernoulli o inversión logarítmica?

p = 0.001
print("bucle U/muestra:", round(1/p), "vs inversión: 1")
Ver solución

Inversión: el bucle gastaría ~1000 U por muestra (10⁸ totales) contra 1. Con p = 0,5 el bucle sería honorable.

Ejercicio 3: VaR que no admite atajos

N(0,1) para percentil 99 %, N = 10⁶: descartá suma-12 y elegí entre Box-Muller y polar con argumento de colas + costo.

Ver una posible respuesta
print("suma-12: 12 U, cola truncada en ±6 → vetada por colas")
print("Box-Muller: 1 U, exacta → candidata")
print("polar: ~1.27 U, exacta, sin trigonometría → candidata") 

Ambas exactas pasan; decide el cronómetro en tu hardware (Tema 39) y la simplicidad de tu base.

09 · Síntesis

Ideas para recordar

  • Colas vetan, N ordena, simplicidad desempata.
  • N chico ⇒ simple; N enorme ⇒ setup amortizado.
  • Aproximar solo sin colas en juego.
  • Todo cambio revalida la batería (Tema 38).
  • Decisión documentada = módulo de biblioteca.

En el próximo tema la obra completa: biblioteca de generación en Python.