Simulation Monte Carlo de Pi en java simple?


J'essaie de faire la fameuse simulation Monte Carlo pour estimer pi pour mon cours Java. Voici la simulation:

 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);
    }
}

J'ai créé du code qui s'exécute correctement, sauf que les résultats ne dépassent jamais ~.8. Je voudrais simplement supposer que cela se produit parce que les nombres aléatoires sont si faibles, mais si cela se produit à chaque fois que quelque chose doit être faux, non? Veuillez garder à l'esprit que ce code contient à propos de toutes les techniques Java que je connais, donc je l'apprécierais si vous gardé d'inclure quoi que ce soit de plus "avancé."Merci!

Author: Ely Beau Eastman, 2014-08-17

1 answers

L'idée du calcul de PI en utilisant la méthode de Monte Carlo est d'échantillonner des points aléatoires dans un carré, et de compter la fraction d'entre eux qui se trouvent dans l'aire d'un cercle lié par ce carré. Si suffisamment de points sont échantillonnés uniformément, la fraction serait proche de l'aire du cercle divisée par l'aire du carré englobant:

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

Et donc

PI = fraction * 4.

Maintenant, puisque vous n'échantillonnez que des coordonnées positives, si nous supposons que le cercle est centré à l'origine (0,0), nous échantillonnons seulement les points dans le quart supérieur droit du cercle et son carré de délimitation, mais l'équation reste la même.

Si votre cercle a un rayon r, vous devez échantillonner les coordonnées entre 0 et r.

Par conséquent, vous devriez changer ceci:

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

À ceci :

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

En outre, la condition devrait être ((Math.pow(xCoord,2) + Math.pow(yCoord,2)) <= r*r).

Bien sûr, vous pouvez le simplifier en éliminant r et en supposant que le rayon est 1.

Dans ce cas, le la condition serait ((Math.pow(xCoord,2) + Math.pow(yCoord,2)) <= 1) et les coordonnées seraient échantillonnées entre 0 et 1.

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