01 · Punto de partida
Cuando la fórmula no alcanza, el azar ayuda
Hay cantidades fáciles de definir pero difíciles de calcular: el área de una figura rara, una integral sin primitiva, la probabilidad de perder dinero con demanda incierta, el valor de π sin calculadora. Intentar la cuenta exacta puede ser imposible o carísimo.
El método de Monte Carlo propone otro camino: generar muchos escenarios aleatorios, evaluar cada uno y promediar. Con suficientes réplicas, el promedio se acerca al valor buscado.
- ¿Qué cantidad quiero aproximar?
- ¿Cómo genero un escenario aleatorio de ese problema?
- ¿Qué calculo en cada réplica?
- ¿Cuántas réplicas necesito para confiar en el promedio?
02 · Definición
Los tres ingredientes
Todo Monte Carlo, del más simple al financiero, combina lo mismo:
Escenario aleatorio
Un caso posible generado con azar: un punto uniforme, una tirada, una demanda simulada. Ejemplo: xᵢ ~ U(0,1).
Réplicas
Repetir N veces lo mismo de forma independiente. N = 100 es un boceto; N = 100 000 es una estimación seria.
Promedio
El estimador: el promedio de lo observado en cada réplica. Ese número es la respuesta Monte Carlo.
Si en cada réplica calculamos g(Xᵢ), el promedio estima la esperanza E[g(X)]. Esa es toda la magia: probabilidades, áreas e integrales se escriben como esperanzas.
| Problema | Vía exacta | Vía Monte Carlo |
|---|---|---|
| Probabilidad de cara | 1/2 por simetría | Tirar 10 000 veces y promediar |
| Área rara | Integrar el contorno | Contar puntos dentro / total |
| Integral sin primitiva | No existe fórmula | Promediar la función en puntos aleatorios |
| Ganancia con demanda incierta | Distribución compleja | Simular demandas y promediar la ganancia |
03 · Cómo funciona
El ciclo en 4 pasos
La simulación estática no tiene reloj: cada réplica es independiente y el orden no importa. Eso la hace simple y paralelizable.
- 1Generar.
Muestrear la entrada:
random.random(), un dado, una demanda normal. Cada xᵢ es un escenario. - 2Evaluar.
Calcular
g(xᵢ): ¿cayó dentro?, ¿cuánto vale f(xᵢ)?, ¿qué ganancia deja? - 3Promediar.
Acumular y dividir por N. Ese promedio es la estimación puntual.
- 4Decidir.
Medir el error (± σ/√N), dar un intervalo y tomar la decisión con ese margen.
- Simulación estática
- No evoluciona en el tiempo: N fotos independientes que se promedian. Lo contrario de la simulación dinámica.
- Estimador
- La regla que convierte las réplicas en número: casi siempre, el promedio muestral.
- Error Monte Carlo
- El promedio tiene ruido: su desvío típico cae como 1/√N. Para partir el error a la mitad, hay que cuadruplicar N.
04 · Ejemplos
Dónde brilla el método
El mismo patrón aparece en problemas muy distintos. Si podés sortearlo y promediarlo, podés estimarlo:
Clásicos
π, áreas e integrales
Tirar puntos en un cuadrado y contar cuántos caen en el círculo: π ≈ 4 · dentro/N. Igual para áreas raras e integrales.
Decisiones
Riesgo, finanzas e inventarios
Simular demandas, precios o fallas y promediar ganancias, pérdidas o faltantes para elegir stock, precio o cobertura.
- 1Moneda.
Estimar P(cara) ≈ caras/N. Con N = 10 000, el error típico es ≈ 0,005.
- 2Dado.
El promedio de un dado tiende a 3,5. Pocas tiradas engañan; miles estabilizan.
- 3π.
Puntos uniformes en [0,1]²: la fracción dentro del cuarto de círculo tiende a π/4.
- 4Inventario.
Demanda aleatoria cada réplica: se promedia la ganancia para cada nivel de stock y se elige el mejor.
05 · Representación en Python
Tu primer Monte Carlo en 5 líneas
En Python, Monte Carlo es un bucle: sortear, evaluar, acumular y dividir. El módulo random es el generador de escenarios.
Python en tu navegador. Los bloques se ejecutan localmente con Pyodide, sin instalar nada. Podés editarlos y re-ejecutarlos.
import random
def montecarlo(N):
caras = sum(1 for _ in range(N) if random.random() < 0.5)
return caras / N
for N in [100, 1000, 10000]:
print(N, montecarlo(N))
Consejo: ejecutalo varias veces con el mismo N. El resultado cambia: ese temblor es el error Monte Carlo.
Promedio de un dado
El mismo esquema estima esperanzas: el promedio de randint(1,6) debe acercarse a 3,5.
import random
def promedio_dado(N):
total = sum(random.randint(1, 6) for _ in range(N))
return total / N
print(promedio_dado(5000))
06 · Exploración
Laboratorio: la moneda se estabiliza
Elegí cuántas tiradas simular y observá cómo el promedio acumulado tiembla al inicio y se calma alrededor de 0,5. Esa calma es la convergencia.
Caras / N → 0,5
estimación = caras / N
Tocá «Correr simulación» para sortear N tiradas.
La línea muestra el promedio acumulado tirada a tirada. La línea punteada marca 0,5, el valor teórico. Con N chico la curva salta; con N grande se pega al 0,5.
Preguntas para explorar
- Corré con N = 100 varias veces. ¿Cuánto varía la estimación entre corridas?
- Subí a N = 10 000. ¿Qué le pasa a la variación y al error típico?
- ¿Por qué la curva se mueve mucho al principio y poco al final?
Ver respuestas sugeridas
- Con N = 100 el error típico es ≈ 0,05: verás valores como 0,44 o 0,56. Es normal, no es un error de código.
- Con N = 10 000 el error cae a ≈ 0,005: las corridas se parecen entre sí. El error cae como 1/√N.
- Al principio cada tirada pesa mucho (1/10, 1/20…); al final cada tirada pesa 1/5000. El promedio viejo «amortigua» lo nuevo.
07 · Comprensión
Confusiones frecuentes
«Monte Carlo da el valor exacto»
No: da una estimación con error. Sin N y sin ± error, el número no significa nada.
«Más N siempre es proporcionalmente mejor»
El error cae como 1/√N: para dividirlo por 10 necesitás 100 veces más réplicas. Hay rendimientos decrecientes.
«Aleatorio significa sin regla»
Al contrario: cada escenario sigue una distribución precisa (uniforme, normal, etc.). El azar está modelado, no es caos.
«Si el promedio dio 0,5 con N = 20, ya convergió»
Con N chico, acertar puede ser suerte. La convergencia se juzga con el error y repitiendo el experimento.
08 · Práctica guiada
Ejercicios con Python
Ejercicio 1: estimar un par del dado
Estimá P(par) tirando un dado N veces. El valor teórico es 0,5. Probá con N = 500 y N = 20 000.
import random
def prob_par(N):
pares = sum(1 for _ in range(N) if random.randint(1, 6) % 2 == 0)
return pares / N
print(prob_par(500))
print(prob_par(20000))
Ver solución razonada
Ambos se acercan a 0,5, pero el de 20 000 tiembla mucho menos. El primero puede dar 0,47 u 0,53; el segundo rara vez se aleja más de 0,01.
Ejercicio 2: predecir antes de correr
Sin ejecutar: si tirás una moneda 4 veces y salen 3 caras, ¿la estimación es 0,75 y eso refuta que la moneda es justa? Después comprobá qué pasa con 4 000 tiradas.
import random
def estimar(N):
return sum(random.random() < 0.5 for _ in range(N)) / N
print(estimar(4))
print(estimar(4000))
Ver solución
0,75 con N = 4 no refuta nada: el error típico es ≈ 0,25. Con N = 4 000 el error es ≈ 0,008 y el valor vuelve a ~0,5. N chico, ruido grande.
Ejercicio 3: escribir el ciclo completo
Escribí montecarlo(N) que devuelva la tupla (estimación, error) para la moneda, usando error = √[p(1−p)/N]. Probala con N = 1 000.
Ver una posible respuesta
import random
import math
def montecarlo(N):
caras = sum(1 for _ in range(N) if random.random() < 0.5)
p = caras / N
error = math.sqrt(p * (1 - p) / N)
return p, error
print(montecarlo(1000))
Verás algo como (0.5, 0.016). La estimación sin el error está incompleta: en temas próximos la convertiremos en intervalo de confianza.
09 · Síntesis
Ideas para recordar
- Monte Carlo estima cantidades sorteando escenarios y promediando: (1/N)·Σ g(Xᵢ).
- Es simulación estática: réplicas independientes, sin reloj, fáciles de paralelizar.
- El error típico cae como 1/√N: cuadruplicar N parte el error a la mitad.
- En Python es un bucle de sortear → evaluar → promediar con
random. - Toda estimación se reporta con su error: el número solo no alcanza.
En el próximo tema veremos la historia del método: de los dados de Ulam y von Neumann en Los Álamos a la computadora moderna.