Esto no es exactamente un cálculo puro, sino más bien un conteo usando números aleatorios. Se trata de imaginar que tenemos una diana y empezamos a lanzarle muchos dardos. A partir del número de aciertos podemos aproximarnos al valor de \( \pi \). La idea es que a partir de un cuadrado de lado \( 1 \) y una circumferencia inscrita en el mismo, dicha circumferencia tendrá un área igual a \( \frac{\pi}{4} \). El área del cuadrado unitario es la suma del área \( A_{int} \) del círculo y el área \( A_{ext} \) de la región exterior. De esta forma \( 1 = A_{ext} + A_{int} \Rightarrow{} A_{ext} = 1 - \frac{\pi}{4} \Rightarrow{} \pi = 4(1 - A_{ext}) \), por lo que sabiendo \( A_{ext} \) podemos saber \( \pi \).
En la siguiente figura \( A_{ext} \) se corresponde con la región pintada de color verde:

Para medir este área simulamos que vamos lanzando dardos. Como en teoría cada dardo tiene la misma probabilidad de caer en un punto u otro (supongamos que el lanzador ha salido de copas y se ha puesto fino), cuantos más dardos lancemos más probabilidad tendremos de acertar en el área verde, así que empezamos a tirar dardos como si no hubiera un mañana con el objetivo de rellenar cuantos más puntos podamos del cuadrado.
Aquí está el código de Python:
import random
def esta_p_fuera_del_circulo (p):
esta_fuera = True
if (p[0] ** 2) + (p[1] ** 2) < 0.25:
esta_fuera = False
return esta_fuera
def tirar_dardos_a_la_diana (num_tiros):
dardos_fuera_de_diana = 0
for _ in range (0, num_tiros):
p_impacto = (random.random() - 0.5, random.random() - 0.5)
if esta_p_fuera_del_circulo (p_impacto):
dardos_fuera_de_diana += 1
return dardos_fuera_de_diana
def calcular_pi (num_tiros):
dardos_fuera_de_diana = tirar_dardos_a_la_diana (num_tiros)
return 4 * (1 - (dardos_fuera_de_diana / num_tiros))
print (calcular_pi (10))
print (calcular_pi (50))
print (calcular_pi (500))
print (calcular_pi (2000))
print (calcular_pi (1000000))
print (calcular_pi (100000000))Aquí los resultados para \( 10 \), \( 50 \), \( 500 \), \( 2000 \), un millón y cien millones de lanzamientos, respectivamente:
3.2
3.04
3.096
3.194
3.144528
3.14154024Hay algoritmos mucho más eficientes, pero como este era muy intuitivo me ha parecido el más divertido.