Método de Monte Carlo · Tema 39

Sistemas probabilísticos

Eventos enredados que no se despejan: se sortean y se cuentan.

01 · Punto de partida

Cuando la combinatoria se rinde

¿Probabilidad de que 23 personas compartan cumpleaños? ¿De que una red con 5 links siga conectada? El espacio muestral es gigante pero sortearlo es trivial: cada réplica es un mundo posible y P = mundos buenos/N.

Es Monte Carlo en estado puro: indicadora por réplica, promedio como probabilidad.

  • ¿Qué es un «mundo» en mi sistema?
  • ¿Cómo lo sorteo columna por columna?
  • ¿Cómo testeo el evento con 0/1?
  • ¿Qué N estabiliza P?

02 · Definición

Mundo, test y conteo

🌍

Mundo

Un escenario completo: 23 cumpleaños, 5 links on/off. Se sortea entero.

✅

Test

Función 0/1: ¿hay coincidencia? ¿hay camino? Una línea que decide.

🔢

Conteo

Fracción de unos: la probabilidad con su √[p(1−p)/N].

Tres sistemas de juguete.
SistemaMundoTest
Cumpleaños n = 2323 U(1,365)¿repetido?
Red 5 links p = 0,95 Bernoulli¿hay camino A–B?
Dado triple3 dados¿suma ≥ 15?

03 · Método

Mundo→Test→Fracción
  1. 1
    Sortear el mundo.

    Todas las columnas iid con su F. Un mundo por réplica.

  2. 2
    Evaluar 0/1.

    Función determinista sobre el mundo: camino, coincidencia, suma.

  3. 3
    Promediar ±.

    p̂ ± 1,96·√[p̂(1−p̂)/N]. Eventos raros piden N ≥ 10/p.

Verificación
Probar con n chico exacto (n = 5 cumpleaños) antes del grande.
Raros
p = 0,001 pide 10 000 para ver 10 casos. Sin casos no hay P.
Determinismo
Dado el mundo, el test no sortea: la única fuente de azar es el mundo.

04 · Ejemplos

  1. 1
    Cumpleaños 23 → 50,7%.

    La intuición dice 10%; Monte Carlo dice 50%. Gana el conteo.

  2. 2
    Red puente.

    Con links 0,9, P(conexión) ≈ 97%: redundancia que se mide.

  3. 3
    Suma ≥ 15 con 3 dados → 20/216.

    Verificable a mano: test del estimador.

05 · Representación en Python

Mundos como listas, test como any

Python en tu navegador. Sortear mundos y contar es todo.

import random

def prob_cumple(n, N=20000):
    casos = 0
    for _ in range(N):
        mundo = [random.randint(1, 365) for _ in range(n)]
        if len(set(mundo)) < n:
            casos += 1
    return casos / N

for n in [10, 23, 40]:
    print(n, round(prob_cumple(n), 3))
import random

def prob_red(p=0.9, N=20000):
    # red serie-paralelo: A-1-B y A-2-B en paralelo, links con p
    casos = 0
    for _ in range(N):
        l1, l2 = random.random() < p, random.random() < p
        if l1 or l2:
            casos += 1
    return casos / N

print(round(prob_red(), 4), "(exacta 0.99)")

06 · Exploración

Laboratorio: 23 bastan para el 50%

Mové n (personas). La curva gris es la exacta; el punto verde tu Monte Carlo con ±2SE. Con n = 23 cruza el 50%.

EXPERIMENTO 39

La paradoja a ojo

P = mundos con coincidencia / N

Los resultados numéricos aparecen debajo.
Monte Carlo—
Exacta—
Error ±—
Lectura—

Tocá «Sortear» con N = 12 000 mundos.

La curva sube en S: con 40 ya supera 89%. Tu punto debe vivir sobre ella dentro del ±.

Preguntas para explorar

  1. Con n = 10, ¿P ronda 12%? ¿Y con n = 50?
  2. ¿Por qué la intuición «n/365» falla tan mal?
  3. ¿Qué N necesitarías para p = 1% con n = 5?
Ver respuestas sugeridas
  1. Sí: ~11,7% y ~97%. La curva es explosiva por pares n(n−1)/2.
  2. Cuenta personas, no pares: hay 253 pares con n = 23, no 23 chances.
  3. N ≥ 10/0,01 = 1 000 para ver ~10 casos. Raros piden N.

07 · Comprensión

Confusiones frecuentes

«P = 0 con N = 500 es imposible»

Puede ser p = 0,001 sin casos. Cero con poco N es «no vi», no «imposible».

«El mundo se sortea de a partes separadas»

Se sortea entero por réplica: partir el mundo entre réplicas rompe la dependencia.

«El test puede sortear»

No: dado el mundo es determinista. Doble azar = doble conteo mal.

«Exacto siempre verifica»

Solo en chicos (n = 5). En grandes la exacta es intratable: ahí MC brilla.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: n = 23

Estimá con N = 20 000 y compará con 0,507.

import random

N, n = 20000, 23
c = sum(1 for _ in range(N) if len({random.randint(1,365) for _ in range(n)}) < n)
print(c/N)
Ver solución razonada

~0,507 ± 0,007. La paradoja verificada por conteo.

Ejercicio 2: exacta vs MC

Calculá la exacta para n = 10 y compará.

p = 1.0
for i in range(10):
    p *= (365-i)/365
print(1-p)
Ver solución

0,1169. MC debe caer dentro de ±2SE: test del motor.

Ejercicio 3: red en paralelo

Dos links p = 0,8 en paralelo: estimá P(conexión).

Ver una posible respuesta
import random

N = 20000
print(sum(1 for _ in range(N) if random.random()<0.8 or random.random()<0.8)/N)

~0,96 = 1 − 0,2². Redundancia medida por conteo.

09 · Síntesis

Ideas para recordar

  • Mundo iid + test 0/1 ⇒ P = casos/N.
  • Separar mundo() de test(): sistema testeable.
  • Verificar en chico exacto antes del grande intratable.
  • Raros piden N ≥ 10/p.
  • Combinatoria imposible ⇒ conteo trivial.

En el próximo tema optimizaremos barriendo: la optimización mediante simulación.