Método de Monte Carlo · Tema 02

Historia del método

Del casino de Mónaco a Los Álamos: cómo un juego de azar se volvió la herramienta para la bomba atómica y luego para todo.

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.

Línea de tiempo mínima del método.
AñoHitoQué aportó
1777Aguja de BuffonTirar agujas para estimar π: el abuelo de Monte Carlo
1908Gosset (Student)Usó muestreo manual para la distribución t
1946Ulam + von NeumannIdea moderna en Los Álamos para neutrones
1949Metropolis y UlamArtículo «The Monte Carlo Method»: nace el nombre
1953Metropolis et al.Muestreo de distribuciones complejas (hoy MCMC)
HoyPC + PythonMillones 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

Tablero→Dados→ENIAC→Python
  1. 1
    Buffon, 1777.

    Tirar agujas sobre tablones y contar cruces para estimar π. Lo recrearás en el laboratorio.

  2. 2
    Gosset, 1908.

    Obrero de Guinness que simulaba a mano para inventar la prueba t de Student.

  3. 3
    Los Álamos, 1946.

    Difusión de neutrones imposible de integrar: se simula partícula por partícula.

  4. 4
    Metropolis, 1949–1953.

    Se publica el método y luego el muestreo de Boltzmann: nace la física computacional.

  5. 5
    Hoy.

    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.

EXPERIMENTO 02

Agujas que estiman π

π ≈ N / cruces

Los resultados numéricos aparecen debajo.
Cruces—
π estimado—
Error |π − 3,1416|—
Lectura—

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

  1. Con N = 100, ¿qué valores de π obtenés en 3 corridas? ¿Alguno absurdo como 2,5 o 4?
  2. Con N = 10 000, ¿en cuánto se estabiliza el segundo decimal?
  3. ¿Qué pasaría si la aguja fuera más larga que la separación entre líneas?
Ver respuestas sugeridas
  1. Sí: con N chico, pocos cruces cambian todo. Verás 2,8 o 3,6 sin que nada esté «roto».
  2. El error típico cae como 1/√N: con 10 000 el π suele estar en 3,14 ± 0,05.
  3. 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.