Generación de Variables Aleatorias · Tema 18

Generación geométrica

Cuántos fracasos hasta el primer éxito: inversión cerrada con logaritmos y bucle Bernoulli, con memoria nula.

01 · Punto de partida

Reintentar hasta que sale

¿Cuántos intentos fallidos antes del primer acierto con prob. p por intento? Reintentos de red, llamadas hasta vender, prototipos hasta aprobar: todos son Geométrica(p), la única discreta sin memoria.

Hay dos formas de generarla: contar Bernoullis uno por uno (didáctico, lento si p es chico) o saltar directo con un logaritmo (O(1), exacto).

  • ¿Fracasos (0,1,…) o ensayos (1,2,…)?
  • ¿Por qué k = ⌊ln(1−U)/ln(1−p)⌋ es exacto?
  • ¿Cuándo el bucle es mejor que la fórmula?
  • ¿Qué significa “sin memoria” en código?

02 · Definición

Masa, cola y falta de memoria

Versión fracasos: soporte {0,1,2,…}, F(k) = 1 − (1−p)^(k+1). Versión ensayos Y = X+1 con media 1/p. Varianza (1−p)/p² en ambas.

⌊ln⌋

Inversión O(1)

Despejar 1−(1−p)^(k+1) ≥ u da el piso logarítmico. Un U, dos logs precomputables: ideal con p chico.

↻

Bucle Bernoulli

Contar fracasos hasta el primer 1. Cuesta media (1−p)/p uniformes: bien si p ≈ 0,5, inviable si p = 0,001.

∅

Sin memoria

P(X ≥ k+j | X ≥ k) = P(X ≥ j). En código: lo ya esperado no cambia lo que falta (como la exponencial continua).

Dos convenciones, una relación.
VersiónSoporteMediaGenerador
Fracasos X{0,1,2,…}(1−p)/p⌊ln(1−U)/ln(1−p)⌋
Ensayos Y = X+1{1,2,…}1/pX + 1

03 · Anatomía

Fórmula vs. bucle, bordes y costo

Fórmula O(1)
Precomputar ln(1−p) una vez. Cada muestra: un log + un piso. Estable salvo p ≈ 0 (ln(1−p) ≈ −p, usar log1p) o U = 1 exacto.
Bucle O(1/p)
Didáctico y sin logs. Con p = 0,5 cuesta ~1 uniforme; con p = 0,01 cuesta ~99. Solo para p grande o para enseñar.
p extrema
p → 1: casi siempre 0 (bucle de 0–1 pasos). p → 0: cola larguísima, valores de miles; graficar truncado + cola “≥K”.
Desbordes
k cabe en int siempre (geométrica finita c.s.). Con p = 1e−9 y U chico, k ~ 10⁹: usar 64 bits.

Inversión logarítmica

Rápida y exacta

Un U por muestra, costo constante. La opción por defecto en producción.

Bucle Bernoulli

Clara pero aleatoria en costo

Útil para validar la fórmula y para enseñar falta de memoria paso a paso.

04 · Dónde espera la geométrica

Del reintento al modelo

Bernoulli(p)×∞→primer 1→X ~ Geom(p)
  1. 1
    Reintentos.

    Red, bases de datos, colas con reintento: número de fallos antes del éxito.

  2. 2
    Ventas y conversión.

    Llamadas hasta el primer “sí” con p por llamada.

  3. 3
    Puente a exponencial.

    Geométrica con p = λ·Δt → Exponencial(λ) al refinar el tiempo. Discreto y continuo unidos.

  4. 4
    Puente a binomial negativa.

    Suma de geométricas = espera del r-ésimo éxito. (Temas 19, 26)

05 · Representación en Python

Fórmula y bucle cara a cara

Mismo p, misma semilla conceptual: la fórmula debe dar igual distribución con 100× menos uniformes cuando p es chico.

Python en tu navegador. Bajá p a 0,05: la media tiende a 19.

import random
import math

random.seed(140)
p, N = 0.3, 8000
den = math.log(1 - p)

def geometrica_inv():
    return int(math.log(1 - random.random()) / den)

def geometrica_bucle():
    k = 0
    while random.random() >= p:
        k += 1
    return k

m = [geometrica_inv() for _ in range(N)]
media = sum(m) / N
print("fórmula media:", round(media, 3), "teórica:", round((1-p)/p, 3))
print("P(X=0):", round(m.count(0)/N, 3), "vs", p)
random.seed(140)
m2 = [geometrica_bucle() for _ in range(500)]
print("bucle (500):", round(sum(m2)/len(m2), 3))

Media ≈ 2,333 y P(X=0) ≈ 0,3. El bucle con 500 ya ronda, pero gasta ~2,3 U por muestra contra 1 de la fórmula.

06 · Exploración

Laboratorio: cola que se alarga con p chico

Movete p con N fijo. Las barras son frecuencia 0…12 (+ cola ≥13); los rombos, p(1−p)^k. Con p = 0,5 cae rápido; con p = 0,1 la cola domina.

EXPERIMENTO 18

Geométrica por inversión

X = ⌊ln(1−U) / ln(1−p)⌋

Los resultados numéricos aparecen debajo.
Media muestral2,333
Teórica (1−p)/p2,333
P(X=0) muestral0,300
Cola ≥130,010

Con p 0,3, media 2,33 y primer valor 0,3.

13 barras 0–12 más cola. Probá p = 0,1 (cola pesada) y p = 0,8 (casi todo en 0).

Preguntas para explorar

  1. Con p = 0,3, ¿media y P(X=0) teóricas? Leelas en el panel.
  2. Bajá a p = 0,1. ¿La media sube a 9? ¿La cola ≥13 crece a ~0,25?
  3. Subí a p = 0,9. ¿Por qué casi toda la masa está en 0 y 1?
Ver respuestas sugeridas
  1. Media 2,333 y P(X=0) = 0,3.
  2. Sí: (1−0,1)/0,1 = 9 y P(X≥13) = 0,9^13 ≈ 0,254.
  3. Porque P(X=0) = 0,9 y P(X=1) = 0,09: el éxito llega casi siempre al primer intento.

07 · Comprensión

Confusiones frecuentes

«Sumo 1 (o no) indistintamente»

Fracasos vs ensayos difieren en 1: media (1−p)/p vs 1/p. Un +1 fantasma arruina la validación.

«Uso log(U) o log(1−U) igual»

En distribución igual, numéricamente no: con U ≈ 1, 1−U pierde precisión. Para p chico preferir log1p(−U) o −Exp(p)/… según librería.

«El bucle siempre es más fiel»

Ambos son exactos; el bucle solo es más caro y con costo aleatorio. La fidelidad se valida igual en ambos.

«Sin memoria significa sin historia»

Significa que la cola condicional no depende de lo esperado: P(X≥k+j|X≥k) = P(X≥j). La historia de fracasos no “acumula suerte”.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: reintentos de red

p = 0,2 por intento, N = 6000 (semilla 141): estimá media (≈ 4) y P(0 reintentos) (≈ 0,2).

import random
import math

random.seed(141)
p, N = 0.2, 6000
den = math.log(1 - p)
m = [int(math.log(1 - random.random()) / den) for _ in range(N)]
print(round(sum(m)/N, 3), "vs 4.0")
print(round(m.count(0)/N, 3), "vs 0.2")
Ver solución razonada

≈ 4,0 y ≈ 0,2 (típicamente 3,8–4,2). Si la media da ≈ 5, sumaste 1 (versión ensayos).

Ejercicio 2: cola por fórmula y por muestra

Con p = 0,1, compará P(X ≥ 13) teórica 0,9^13 ≈ 0,254 contra 8000 muestras.

import random
import math

random.seed(142)
p, N = 0.1, 8000
den = math.log(1 - p)
m = [int(math.log(1 - random.random()) / den) for _ in range(N)]
print(round(sum(1 for x in m if x >= 13) / N, 3), "vs", round(0.9 ** 13, 3))
Ver solución

Ambos ≈ 0,25. Las colas necesitan N grande: con N = 200 el intervalo sería 0,19–0,31.

Ejercicio 3: bucle que cuesta

Contá uniformes por muestra del bucle con p = 0,05 vs fórmula (1 U). El factor debe rondar 1/p = 20… en realidad (1−p)/p+1 = 20.

Ver una posible respuesta
import random

random.seed(143)
p, N = 0.05, 2000
usados = 0
m = []
for _ in range(N):
    k = 0
    while True:
        usados += 1
        if random.random() < p:
            break
        k += 1
    m.append(k)
print("U por muestra (bucle):", round(usados / N, 1), "vs fórmula: 1.0")
print("media:", round(sum(m) / N, 2), "vs 19.0")

~20 U por muestra en bucle contra 1 en fórmula. Con p = 0,001 serían ~1000: la fórmula gana por goleada.

09 · Síntesis

Ideas para recordar

  • Geométrica(p): P(X=k) = p(1−p)^k, media (1−p)/p (fracasos).
  • Inversión ⌊ln(1−U)/ln(1−p)⌋: O(1), exacta, la defecto.
  • Bucle Bernoulli: didáctico, costo medio 1/p uniformes.
  • Sin memoria discreta, como la exponencial continua.
  • Fijar convención fracasos/ensayos en el nombre.

En el próximo tema sumaremos Bernoullis: la binomial.