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].
| Sistema | Mundo | Test |
|---|---|---|
| Cumpleaños n = 23 | 23 U(1,365) | ¿repetido? |
| Red 5 links p = 0,9 | 5 Bernoulli | ¿hay camino A–B? |
| Dado triple | 3 dados | ¿suma ≥ 15? |
03 · Método
- 1Sortear el mundo.
Todas las columnas iid con su F. Un mundo por réplica.
- 2Evaluar 0/1.
Función determinista sobre el mundo: camino, coincidencia, suma.
- 3Promediar ±.
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
- 1Cumpleaños 23 → 50,7%.
La intuición dice 10%; Monte Carlo dice 50%. Gana el conteo.
- 2Red puente.
Con links 0,9, P(conexión) ≈ 97%: redundancia que se mide.
- 3Suma ≥ 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%.
La paradoja a ojo
P = mundos con coincidencia / N
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
- Con n = 10, ¿P ronda 12%? ¿Y con n = 50?
- ¿Por qué la intuición «n/365» falla tan mal?
- ¿Qué N necesitarías para p = 1% con n = 5?
Ver respuestas sugeridas
- Sí: ~11,7% y ~97%. La curva es explosiva por pares n(n−1)/2.
- Cuenta personas, no pares: hay 253 pares con n = 23, no 23 chances.
- 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.