01 · Punto de partida
Un enfermo, un solitario y un casino
En 1946, el matemático Stanislaw Ulam estaba convaleciente y jugaba solitarios para pasar el tiempo. Se preguntó: ¿qué probabilidad hay de que un solitario salga? Calcularla con combinatoria era un laberinto, pero jugar cientos de veces y contar era fácil.
Le contó la idea a John von Neumann en Los Álamos. Faltaban computadoras para simular la difusión de neutrones de la bomba atómica y el azar repetido era la salida. Como el trabajo era secreto, le pusieron un nombre en clave: Monte Carlo, por el famoso casino de Mónaco.
- ¿Por qué la combinatoria exacta no alcanzaba?
- ¿Qué aportó la computadora ENIAC a la idea?
- ¿Por qué un nombre de casino para un proyecto secreto?
- ¿Qué queda hoy de aquella idea de 1946?
02 · Protagonistas
Tres nombres, una computadora
Stanislaw Ulam
La intuición: estimar probabilidades jugando muchas veces. Del solitario a los neutrones.
John von Neumann
El programador: propuso el primer generador pseudoaleatorio (middle-square) y llevó el método a la ENIAC.
Nicholas Metropolis
El bautismo: coautor del artículo de 1949 «The Monte Carlo Method» que hizo público el secreto.
| Año | Hito | Qué aportó |
|---|---|---|
| 1777 | Aguja de Buffon | Tirar agujas para estimar π: el abuelo de Monte Carlo |
| 1908 | Gosset (Student) | Usó muestreo manual para la distribución t |
| 1946 | Ulam + von Neumann | Idea moderna en Los Álamos para neutrones |
| 1949 | Metropolis y Ulam | Artículo «The Monte Carlo Method»: nace el nombre |
| 1953 | Metropolis et al. | Muestreo de distribuciones complejas (hoy MCMC) |
| Hoy | PC + Python | Millones de réplicas en segundos para riesgo y finanzas |
03 · Precursores y despegue
La idea es vieja, la potencia es nueva
Tirar y contar para estimar no es de 1946: Buffon ya estimaba π con agujas en el siglo XVIII. Lo que cambió en Los Álamos fue la velocidad: la ENIAC podía hacer miles de «tiradas» sin cansarse.
Antes de la computadora
Experimentos heroicos
Gosset y sus ayudantes tiraban dados y sacaban bolas a mano. Cientos de réplicas llevaban semanas y el error seguía grande.
Con la computadora
Millones de réplicas
Un bucle en Python hace 100 000 escenarios en un segundo. El error cae como 1/√N y lo imposible se vuelve rutinario.
- Aguja de Buffon (1777)
- Al tirar una aguja sobre líneas paralelas, P(cruce) = 2/π. Despejando π ≈ 2·N/cruces. Es Monte Carlo sin computadora.
- ENIAC (1945)
- Primera computadora electrónica de uso general. Von Neumann la usó para las primeras simulaciones Monte Carlo reales.
- Pseudoazar
- Números que parecen aleatorios pero salen de una fórmula con semilla. Von Neumann inventó el middle-square; hoy usamos Mersenne Twister.
04 · Ejemplos históricos
Cinco momentos para recordar
- 1Buffon, 1777.
Tirar agujas sobre tablones y contar cruces para estimar π. Lo recrearás en el laboratorio.
- 2Gosset, 1908.
Obrero de Guinness que simulaba a mano para inventar la prueba t de Student.
- 3Los Álamos, 1946.
Difusión de neutrones imposible de integrar: se simula partícula por partícula.
- 4Metropolis, 1949–1953.
Se publica el método y luego el muestreo de Boltzmann: nace la física computacional.
- 5Hoy.
Riesgo bancario, confiabilidad, inventarios e integrales en tu navegador con el mismo ciclo de 1946.
05 · Representación en Python
Del middle-square a random
Von Neumann generaba azar con aritmética: tomar los dígitos del medio del cuadrado. Funciona un rato y luego se traba. Python usa un generador moderno, pero la idea es la misma: semilla → fórmula → secuencia.
Python en tu navegador. Ejecutá ambos bloques y compará: el generador viejo se repite y se queda en cero; el moderno aguanta millones.
def middle_square(semilla, n):
x = semilla
salida = []
for _ in range(n):
x = (x * x // 100) % 10000 # 4 dígitos del medio
salida.append(x / 10000)
if x == 0:
break
return salida
print(middle_square(1234, 10))
Consejo: probá con semilla 1000 o 0 y mirá cómo colapsa. Por eso hoy no lo usamos.
import random
random.seed(1949) # Los Álamos en tu navegador
tiradas = [random.random() for _ in range(5)]
print(tiradas)
print("Repetible:", [random.random() for _ in range(2)])
random.seed(1949)
print("Mismo inicio:", [random.random() for _ in range(2)])
06 · Exploración
Laboratorio: la aguja de Buffon (1777)
Tiramos agujas de largo 1 sobre líneas separadas por 2. La fracción que cruza una línea tiende a 1/π, así que π ≈ N / cruces. Movete el control y mirá cómo el π estimado se acerca a 3,1416.
Agujas que estiman π
π ≈ N / cruces
Tocá «Tirar agujas» para simular N lanzamientos.
Cada segmento es una aguja: verde si cruza una línea, gris si no. Con pocas agujas el π salta; con miles se pega a 3,14.
Preguntas para explorar
- Con N = 100, ¿qué valores de π obtenés en 3 corridas? ¿Alguno absurdo como 2,5 o 4?
- Con N = 10 000, ¿en cuánto se estabiliza el segundo decimal?
- ¿Qué pasaría si la aguja fuera más larga que la separación entre líneas?
Ver respuestas sugeridas
- Sí: con N chico, pocos cruces cambian todo. Verás 2,8 o 3,6 sin que nada esté «roto».
- El error típico cae como 1/√N: con 10 000 el π suele estar en 3,14 ± 0,05.
- La fórmula simple π ≈ N/cruces deja de valer: una aguja larga puede cruzar dos líneas. Hay que usar la fórmula general de Buffon.
07 · Comprensión
Confusiones frecuentes
«Monte Carlo se inventó para el casino»
No: tomó el nombre del casino como clave secreta. Nació para física nuclear, no para apostar.
«Antes de la computadora no había Monte Carlo»
Había precursores (Buffon, Gosset) a mano. La computadora lo volvió práctico, no lo inventó de cero.
«El azar de la computadora es azar de verdad»
Es pseudoazar: determinista pero indistinguible en la práctica si el generador es bueno y la semilla cambia.
«La historia no importa para programar»
Importa: entender middle-square y ENIAC explica por qué hoy fijamos semillas y por qué N grande manda.
08 · Práctica guiada
Ejercicios con Python
Ejercicio 1: romper el middle-square
Generá 50 valores con semilla 1234 y contá cuántos distintos hay. Luego probá con random.random().
def middle_square(semilla, n):
x = semilla
salida = []
for _ in range(n):
x = (x * x // 100) % 10000
salida.append(x / 10000)
if x == 0:
break
return salida
viejos = middle_square(1234, 50)
print("generados:", len(viejos), "distintos:", len(set(viejos)))
Ver solución razonada
El middle-square se cicla o cae en 0 en pocas decenas de pasos: verás menos de 50 distintos. Con random obtendrás 50 distintos casi siempre.
Ejercicio 2: Buffon en 6 líneas
Estimá π con la aguja corta (L = 1, D = 2): el centro cae uniforme y el ángulo también. Contá cruces y aplicá π ≈ N/cruces.
import random
import math
def buffon(N):
cruces = 0
for _ in range(N):
y = random.random() * 2 # centro entre líneas separadas 2
ang = random.random() * math.pi
# la punta vertical llega a y +/- (L/2)*sin(ang), L = 1
dy = 0.5 * math.sin(ang)
if y - dy <= 0 or y + dy >= 2:
cruces += 1
return N / cruces if cruces else float("inf")
print(buffon(10000))
Ver solución
Deberías ver algo entre 3,05 y 3,25. Si sale inf o un valor loco con N = 20, es el ruido de N chico, no un bug.
Ejercicio 3: semillas y reproducibilidad
Fijá la semilla, corré dos veces y comprobá que da igual; luego cambiala y mirá cuánto se mueve π con N = 2 000.
Ver una posible respuesta
import random
import math
def buffon(N):
cruces = 0
for _ in range(N):
y = random.random() * 2
ang = random.random() * math.pi
if y - 0.5 * math.sin(ang) <= 0 or y + 0.5 * math.sin(ang) >= 2:
cruces += 1
return N / cruces if cruces else float("inf")
random.seed(7)
print("corrida 1:", buffon(2000))
random.seed(7)
print("corrida 2 (igual):", buffon(2000))
random.seed(99)
print("otra semilla:", buffon(2000))
Las dos primeras coinciden: reproducibilidad. La tercera se mueve unas centésimas: ese es el error Monte Carlo con N = 2 000.
09 · Síntesis
Ideas para recordar
- El método nació en Los Álamos (Ulam, von Neumann, Metropolis, 1946–1949) con nombre de casino como clave.
- Tenía precursores sin computadora: Buffon (π con agujas) y Gosset (muestreo manual).
- La computadora lo volvió práctico: de cientos de réplicas a mano a millones por segundo.
- El azar de la computadora es pseudoazar con semilla: reproducible si la fijás.
- La aguja de Buffon es el «hola mundo» histórico: π ≈ N/cruces.
En el próximo tema veremos el principio fundamental del muestreo aleatorio: cómo convertir cualquier incertidumbre en escenarios sorteables.