Simulazione Monte Carlo di Pi in java semplice?


Sto cercando di fare la famosa simulazione Monte Carlo per stimare pi per il mio corso Java. Ecco la simulazione:

 public class Darts
    {
    //"throwing" a dart
    public static boolean [] dartThrow(int r, int d){
        boolean [] booleanArray = new boolean[d];
        for(int i = 0; i < d; i++){
        double xCoord = Math.random() * 2;
        double yCoord = Math.random() * 2;
        if((Math.pow(xCoord,2) + Math.pow(yCoord,2)) <= r){
            booleanArray[i] = true;
        }
        else{
            booleanArray [i] = false;
        }
       }
       return booleanArray;
    }

    //calculating pi from throwing results
    public static double piEstimater(boolean [] h, int d){
        int trueCounter = 0;
        for(int i = 0; i < h.length; i++){
            if(h[i] == true){
                trueCounter++;
            }
        }
        return 4 * ((double)trueCounter / d);
    }

    //printing results
    public static void printer(double [] a){
        System.out.println("     Pi Estimation Tool    ");
        System.out.println("---------------------------");
        for(int i = 0; i < a.length; i++){
            System.out.print("Trial [" + i + "]: pi = ");
            System.out.printf("%6f\n", a[i]);
        }
    }

    public static void main(String[] args){
        //variables
        Scanner in = new Scanner(System.in);
        int radius = 1;
        int darts;
        int trials;

        System.out.println("Enter the number of darts to calculate for: ");
        darts = in.nextInt();
        System.out.println("Enter the number of trials to calculate for: ");
        trials = in.nextInt();

        double [] arrayOfEstimates = new double [trials];
        int i = 0;
        for(double a : arrayOfEstimates){
           boolean [] hitCounter = dartThrow(radius, darts);
           double piEstimate = piEstimater(hitCounter, darts);
           arrayOfEstimates[i] = piEstimate;
           i++;
        }

        printer(arrayOfEstimates);
    }
}

Ho creato codice che viene eseguito correttamente, tranne che i risultati non superano mai ~ .8. Vorrei solo supporre che questo stia accadendo perché i numeri casuali sono così bassi, ma se succede ogni volta che qualcosa deve essere sbagliato, giusto? Tieni presente che questo codice contiene tutte le tecniche Java che conosco, quindi lo apprezzerei se tu tenuto da includere qualcosa di più " avanzato."Grazie!

Author: Ely Beau Eastman, 2014-08-17

1 answers

L'idea del calcolo di PI usando il metodo Monte Carlo è di campionare punti casuali in un quadrato e contare la frazione di essi che rientrano nell'area di un cerchio legato da quel quadrato. Se un numero sufficiente di punti sono campionati in modo uniforme, la frazione sarebbe vicina all'area del cerchio divisa per l'area del quadrato di delimitazione:

fraction = PI*r^2/(2r)^2

E quindi

PI = fraction * 4.

Ora, dal momento che stai campionando solo coordinate positive, se assumiamo che il cerchio sia centrato all'origine (0,0), campioniamo solo i punti all'interno del quarto in alto a destra del cerchio e del suo quadrato di delimitazione, ma l'equazione rimane la stessa.

Se il tuo cerchio ha raggio r, dovresti campionare le coordinate tra 0 e r.

Quindi dovresti cambiare questo :

    double xCoord = Math.random() * 2;
    double yCoord = Math.random() * 2;

A questo:

    double xCoord = Math.random() * r;
    double yCoord = Math.random() * r;

Inoltre la condizione deve essere ((Math.pow(xCoord,2) + Math.pow(yCoord,2)) <= r*r).

Ovviamente, puoi semplificarlo eliminando r e assumendo che il raggio sia 1.

In tal caso il la condizione sarebbe ((Math.pow(xCoord,2) + Math.pow(yCoord,2)) <= 1) e le coordinate sarebbero campionate tra 0 e 1.

 2
Author: Eran, 2014-08-17 03:58:34