01 · Punto de partida
Equivocarse es barato, no detectarlo es caro
El 90% de las simulaciones rotas fallan por 8 causas conocidas: F equivocada, U reutilizada, ×(b−a) olvidado, parada en el cruce, s por SE, semillas, N mágico y media sin ±. Con checklist se cazan en minutos.
Este tema es la vacuna antes del proyecto final.
- ¿Mi F es la del problema o la cómoda?
- ¿Cada columna usa su U fresco?
- ¿Multipliqué por el ancho/volumen?
- ¿Paré por regla o por cruce lindo?
02 · Catálogo
Los 8 sospechosos habituales
| # | Bug | Síntoma | Vacuna |
|---|---|---|---|
| 1 | F equivocada | Converge lejos del teórico | Validar generadora sola |
| 2 | U reutilizada | Correlación 1 falsa (π ≈ 2,83) | Un U por columna |
| 3 | Olvidar ×(b−a) | Da la altura media (0,64 vs 2) | Test con exacta |
| 4 | Parar en el cruce | «Exacto» con N chico | Regla por bloques |
| 5 | s por SE | «50 ± 15» en vez de ±0,15 | SE = s/√N siempre |
| 6 | Semilla única | Nadie lo repite | R semillas + log |
| 7 | N mágico | ± que no alcanza | N = (zσ/e)² |
| 8 | Media sin ± | Decide a ciegas | media [li, ls] (N) |
03 · Tres bugs en detalle
U reutilizada
Usar x = y en π estima 2,83, no 3,14. La diagonal delata: nube en línea, no nube.
Sin ×ancho
∫₀^π sin sin ×π da 0,64 (altura) en vez de 2 (integral). Factor 5 de error.
Parar en cruce
π̂ cruza 3,1416 con N = 300 y se va. Parar ahí es elegir la suerte.
04 · Síntomas que delatan
- 1π ≈ 2,83 clavado.
U reutilizada (x = y). Nube en diagonal.
- 2Integral 3× menor.
Falta ×(b−a). Revisar escala.
- 3«Exacto» con N = 200.
Cruce casual. Pedir banda, no punto.
05 · Representación en Python
Cazar los 3 bugs en código
Python en tu navegador. Mal vs bien, lado a lado.
import random
import math
N = 10000
# Bug 2: x = y en pi
mal = sum(1 for _ in range(N) if (u := random.random())**2 + u**2 <= 1) / N * 4
bien = sum(1 for _ in range(N) if random.random()**2 + random.random()**2 <= 1) / N * 4
print("pi mal (x=y):", round(mal, 3), "bien:", round(bien, 3))
# Bug 3: sin x(b-a)
mal2 = sum(math.sin(random.random()*math.pi) for _ in range(N)) / N
print("sin mal (sin xpi):", round(mal2, 3), "bien:", round(mal2*math.pi, 3), "(2.0)")
06 · Exploración
Laboratorio: museo del bug
Elegí el bug y N. Barra roja con bug vs verde correcta y línea de la exacta. El bug no se mueve con N: es sesgo, no ruido.
Sesgo que N no cura
mal vs bien vs exacta
Tocá «Cazar» para comparar.
El verde tiembla alrededor de la exacta y se calma con N. El rojo vive lejos siempre: más N no lo trae.
Preguntas para explorar
- Con N = 30 000, ¿el rojo se acerca a la exacta?
- ¿Cómo distinguir sesgo de ruido con N?
- ¿Qué test cazaría cada bug en 1 minuto?
Ver respuestas sugeridas
- No: 2,83 y 0,64 clavados. Sesgo ≠ ruido.
- El ruido cae 1/√N; el sesgo no se mueve. Si no se mueve con ×4 N, es bug.
- π ≈ 3,14 y ∫₀^π sin = 2: dos asserts que cazan el 80%.
07 · Checklist
Antibugs en 1 minuto
Checklist pre-informe (copiar y pegar)
☐ F validada sola · ☐ U frescos · ☐ ×(b−a)/Vol · ☐ N por fórmula · ☐ R semillas · ☐ media ± SE + IC · ☐ test π/x² pasa · ☐ código + semillas versionados.
08 · Práctica guiada
Ejercicios con Python
Ejercicio 1: detectar sesgo con ×4 N
Si con N y 4N da lo mismo lejos de la exacta, ¿ruido o bug?
print("Bug: el ruido caería a la mitad; si no se mueve, es sesgo.")
Ver solución razonada
Regla de oro del debug Monte Carlo: ×4 N parte el ruido a la mitad. Lo que queda es sesgo.
Ejercicio 2: asserts de humo
Escribí 2 asserts que fallen con los bugs del laboratorio.
import random
import math
N = 5000
pi = sum(1 for _ in range(N) if random.random()**2 + random.random()**2 <= 1)/N*4
assert abs(pi-3.14) < 0.1, pi
s = sum(math.sin(random.uniform(0, math.pi)) for _ in range(N))/N*math.pi
assert abs(s-2) < 0.1, s
print("humo OK")
Ver solución
Con bug dan 2,83 y 0,64: los asserts gritan. Sin bug pasan.
Ejercicio 3: s vs SE
Con s = 15 y N = 100, ¿informás ±15 o ±1,5?
Ver una posible respuesta
print(15/(100**0.5))
±1,5: el error del promedio, no la dispersión del dato.
09 · Síntesis
Ideas para recordar
- Sesgo no se mueve con N; ruido cae 1/√N: ×4 N diagnostica.
- 8 bugs cubren el 90%: F, U, ×ancho, cruce, s/SE, semillas, N, ±.
- Test π + x²(1,2) + moneda cazan casi todo en 1 minuto.
- Checklist pre-informe siempre, sin excepciones.
- Versionar código + semillas: bug reproducible es bug cazable.
En el próximo y último tema integraremos todo: el proyecto integral de Monte Carlo.