Supongamos que lanzamos dardos al azar a un tablero cuadrado que mide dos metros de cada lado l, y que contiene un círculo que mide un metro de radio r, tal como se muestra en la siguiente figura:
El área del cuadrado es l × l = 2 × 2 = 4, mientras que el área del círculo es π × r 2 = π × 12 = π. Si los puntos en los que caen los dardos están distribuidos de manera uniforme (y siempre dentro del cuadrado), entonces se cumple aproximadamente con la siguiente relación:
Podemos utilizar esta fórmula para estimar el valor de pi utilizando un generador de número aleatorios. El código secuencial en Java se vería así:
public static double sequentialMonteCarlo(int n) { int sum = 0; for (int i = 0; i < n; i++) { // Generar dos números aleatorios entre -1 y 1. double x = ThreadLocalRandom.current().nextDouble() * 2 - 1; double y = ThreadLocalRandom.current().nextDouble() * 2 - 1; // Aplicar teorema de Pitágoras. double h = x * x + y * y; // Verificar si el tiro cayó dentro del círculo. if (h <= 1) { sum++; } } return 4 * ((double) sum / n); }
A este algoritmo se le llama método de “Monte Carlo” debido a que involucra eventos aleatorios (los tiros de dardos).
Reference: [PACHECO] pp. 267 y 268.