01 · Punto de partida
El azar que sí representa
No cualquier azar sirve. Tirar una moneda justa no representa la demanda de un negocio ni el tiempo entre fallas. El principio fundamental dice: si la muestra se genera con la misma distribución que la realidad, el promedio muestral estima la realidad.
Por eso el corazón de Monte Carlo no es el promedio: es sortear bien. Un mal muestreo arruina millones de réplicas; un buen muestreo hace que mil alcancen.
- ¿Qué distribución tiene mi incertidumbre?
- ¿Cómo la convierto en sorteos en Python?
- ¿Mis sorteos son independientes e idénticos (iid)?
- ¿La muestra se parece a la realidad cuando N crece?
02 · Definición
Muestrear es imitar la distribución
Distribución F
La regla del azar: qué valores salen y con qué probabilidad. Uniforme, dado, Bernoulli, normal, empírica.
Muestra iid
Independiente e idénticamente distribuida: cada sorteo no mira al anterior y todos usan la misma F.
Representatividad
Con N grande, la muestra copia a F: el histograma se parece a la teoría y el promedio se pega a la esperanza.
| Incertidumbre | Distribución | Sorteo en Python |
|---|---|---|
| Punto al azar en [0,1] | Uniforme(0,1) | random.random() |
| Dado, cara o sello | Discreta equiprobable | random.randint(1,6) |
| Cliente compra o no (30%) | Bernoulli(0,3) | random.random() < 0.3 |
| Demanda 10/20/30 con 50/30/20% | Empírica con pesos | random.choices(val, weights=w) |
| Medición con ruido | Normal(μ,σ) | random.gauss(mu, sigma) |
03 · Cómo funciona
De la incertidumbre al sorteo en 3 pasos
- 1Observar.
¿La demanda es 10, 20 o 30 con qué frecuencia? ¿El tiempo de falla es exponencial? Los datos sugieren F.
- 2Elegir F.
Uniforme si todo vale igual, Bernoulli si es sí/no, normal si hay campana, empírica si solo tengo tabla de frecuencias.
- 3Sortear iid.
Un sorteo por réplica, sin memoria: no reutilizar el mismo número, no «compensar» rachas.
Bien muestreado
La muestra copia a F
Histograma parejo para el dado, 30% de unos para Bernoulli(0,3), campana para la normal. El promedio coincide con la teoría.
Mal muestreado
El promedio miente
Usar uniforme cuando era normal, reutilizar sorteos o «corregir» rachas sesga todo. N grande no arregla un F equivocado.
- iid
- Independientes e idénticamente distribuidos: la condición que exige la Ley de los Grandes Números. Sin iid, no hay garantía.
- Semilla
- Número inicial del generador. Igual semilla = igual muestra: sirve para depurar y para reproducir.
- Tamaño N
- Más N = muestra más fiel, pero el error cae lento (1/√N). Primero elegir bien F, después agrandar N.
04 · Ejemplos
Cinco sorteos de todos los días
- 1Punto en [0,1].
random.random(). Promedio → 0,5. Base de áreas e integrales. - 2Dado.
randint(1,6). Promedio → 3,5. Cada cara debe salir ~1/6. - 3Compra sí/no.
random() < 0.3. Promedio → 0,3. Así se simula riesgo y conversión. - 4Demanda con pesos.
choices([10,20,30], weights=[50,30,20]). Promedio → 10·0,5 + 20·0,3 + 30·0,2 = 17. - 5Ruido normal.
gauss(100, 15). Promedio → 100. Así se modela error de medición e incertidumbre continua.
05 · Representación en Python
La caja de herramientas random
Casi todo Monte Carlo estático sale de estas cinco funciones. Aprendelas de memoria.
Python en tu navegador. Ejecutá, cambiá N y los pesos, y mirá cómo el promedio se acerca a la teoría.
import random
N = 10000
uniformes = [random.random() for _ in range(N)]
dados = [random.randint(1, 6) for _ in range(N)]
compras = [1 if random.random() < 0.3 else 0 for _ in range(N)]
print("U(0,1) →", sum(uniformes) / N, "(teórico 0.5)")
print("Dado →", sum(dados) / N, "(teórico 3.5)")
print("Bernoulli(0.3) →", sum(compras) / N, "(teórico 0.3)")
Consejo: corré dos veces con N = 100 y con N = 10 000. El temblor con N chico es la lección.
Demanda empírica con pesos
import random
valores = [10, 20, 30]
pesos = [50, 30, 20]
N = 10000
muestra = random.choices(valores, weights=pesos, k=N)
print("Promedio:", sum(muestra) / N, "(teórico 17.0)")
print("Frecuencias:", {v: muestra.count(v) / N for v in valores})
06 · Exploración
Laboratorio: la muestra copia a la realidad
Elegí la distribución y la cantidad de sorteos. El histograma verde es tu muestra; la línea amarilla es el valor teórico y la celeste tu promedio. Con N grande se abrazan.
Muestrear bien, estimar bien
promedio muestral → esperanza
Tocá «Sortear» para generar la muestra.
Barras: frecuencia de cada intervalo o valor. Línea amarilla punteada: teoría. Línea celeste: tu promedio. Si sorteás bien, con N grande coinciden.
Preguntas para explorar
- Con Uniforme y N = 200, ¿las 10 barras son parejas? ¿Y con N = 20 000?
- Con Dado y N = 300, ¿alguna cara «desaparece»? ¿Qué pasa con N = 12 000?
- Con Bernoulli(0,3), ¿por qué la barra del 0 es más alta que la del 1 aunque el sorteo sea justo?
Ver respuestas sugeridas
- No: con N chico hay huecos y picos falsos. Con N grande las barras se emparejan: la muestra copia a la uniforme.
- Con N = 300 alguna cara puede salir la mitad que otra por puro ruido. Con N grande todas rondan 1/6.
- Porque P(1) = 0,3 y P(0) = 0,7: lo justo es que el 0 salga más. Justo no significa mitad y mitad, sino respetar F.
07 · Comprensión
Confusiones frecuentes
«Aleatorio es tirar cualquier cosa»
No: cada problema tiene su F. Tirar uniforme cuando tocaba normal es el error más frecuente y el más grave.
«Si salió mucho 0, ahora toca 1»
La falacia del jugador: los sorteos iid no tienen memoria. Cada réplica empieza de cero.
«Con N enorme todo se arregla»
N grande reduce el ruido, pero no corrige una F equivocada ni sorteos dependientes.
«Reutilizar la misma muestra da igual»
Reutilizar rompe la independencia (iid) y subestima el error. Cada réplica necesita su sorteo fresco.
08 · Práctica guiada
Ejercicios con Python
Ejercicio 1: verificar el dado
Sorteá 6 000 dados y comprobá que cada cara sale ~1/6 y el promedio ~3,5.
import random
N = 6000
tiradas = [random.randint(1, 6) for _ in range(N)]
print("Promedio:", sum(tiradas) / N)
for cara in range(1, 7):
print(cara, tiradas.count(cara) / N)
Ver solución razonada
Cada frecuencia debe rondar 0,166 ± 0,01 y el promedio 3,5 ± 0,05. Si alguna cara da 0,10 o 0,25 con N = 6 000, sospechá del generador, no del azar.
Ejercicio 2: Bernoulli a mano
Sin usar choices: simulá 5 000 clientes que compran con p = 0,3 usando random() y estimá la proporción.
import random
N = 5000
compras = sum(1 for _ in range(N) if random.random() < 0.3)
print(compras / N)
Ver solución
Verás ~0,30 ± 0,015. La condición random() < p es la forma canónica de sortear Bernoulli(p).
Ejercicio 3: demanda empírica
La demanda es 0, 1 o 2 unidades con probabilidades 0,2, 0,5 y 0,3. Escribí generar_demanda() y estimá la demanda media teórica (1,1) con N = 10 000.
Ver una posible respuesta
import random
def generar_demanda():
r = random.random()
if r < 0.2:
return 0
if r < 0.7:
return 1
return 2
N = 10000
m = sum(generar_demanda() for _ in range(N)) / N
print(m)
Deberías ver ~1,1. Este «acumular probabilidades» es la transformada inversa a mano: la base para sortear cualquier discreta.
09 · Síntesis
Ideas para recordar
- El principio fundamental: muestra iid con distribución F ⇒ el promedio estima E[g(X)].
- Sortear bien es elegir bien F: uniforme, discreta, Bernoulli, empírica o normal según el caso.
- Justo no es mitad y mitad: es respetar las probabilidades de F.
- Los sorteos no tienen memoria: cada réplica es fresca e independiente.
- N grande pule el ruido, pero jamás corrige una F equivocada.
En el próximo tema veremos la simulación estática: el marco donde estas muestras independientes se convierten en decisiones.