Il metodo "Monte Carlo" è una stategia di risoluzione di problemi che utilizza la statistica: se la probabilità di un certo evento è P possiamo simulare in maniera random questo evento e ottenere P facendo (numero di volte in cui il nostro evento è avvenuto)/(simulazioni totali).

Vediamo come applicare questa strategia per ottenere un'approssimazione di pi greco. Data un cerchio di raggio 1, esso può essere inscritto in un quadrato di raggio 2. Guardiamo solamente ad uno spicchio del cerchio:

 

In questo modo sappiamo che l'area del quadrato in blu è 1 e l'area dell'area rossa invece è pi/4. Se generiamo N numeri random all'interno del quadrato il numero di punti che cadono nel cerchio M diviso il numero totale di numeri generati N dovrà approssimare appunto l'area del cerchio e quindi p/4.

In sostanza otterremo pi = 4 * M / N.

Maggiore sarà il numero di punti generati più precisa sarà l'approssimazione di pi.

Di seguito il codice per effettuare questa semplice implementazione utilizzando la classe random di C#

 

            var rand = new Random();
            var pointsNumber = 1000000;

            var insideCircle = 0;
            var outsideCircle = 0;

            for (int i = 0; i < pointsNumber; i++)
            {
                var x = rand.NextDouble();
                var y = rand.NextDouble();

                if (x * x + y * y < 1)
                    insideCircle++;
                else
                    outsideCircle++;
            }

            var pi = 4.0 * insideCircle / pointsNumber;

Chiaramente ogni esecuzione darà un valore leggermente diverso ma aumentando il numero di punti possiamo "stabilizzare" un numero di cifre decimali a piacere. Osserviamo come l'implementazione del random sia determinante per questo calcolo: se i double non fossero generati in maniera uniforme tra 0 e 1 il valore di pi risulterebbe sbagliato!

comments powered by Disqus