Метод Монте-Карло не точен - PullRequest
3 голосов
/ 15 марта 2019

На праздновании Пи Дня я решил реализовать метод Монте-Карло , чтобы приблизить значение π , но мой алгоритм, похоже, неработать.

Я пробовал работать с другими параметрами, но я всегда получаю примерно 3,66

Я пробовал отлаживать, но не могу понять.

public class ApproximatePi {

    private int iterations; // how many points to test
    private double r; // width of the square / radius of circle (quarter circle)

    private int inCount = 0; // number of points that are inside the circle
    private int outCount = 0; // number of points outside of the circle

    private Random getNum = new Random(System.currentTimeMillis());

    ApproximatePi(int iterations, double r) {
        this.iterations = iterations;
        this.r = r;
        // getNum = new Random(System.currentTimeMillis());
    }

    public double getApproximation() {
        for (int i = 0; i < iterations; i++) {
            double x = (r) * getNum.nextDouble();
            double y = (r) * getNum.nextDouble();
            if (inside(x, y)) {
                inCount++;
            } else
                outCount++;
        }
        double answer = (double) inCount / (double) outCount;
        return answer;
    }

    private boolean inside(double x, double y) {
        // if the hypotenuse is greater than the radius, the point is outside the circle
        if (getHypot(x, y) >= r) {
            return false;
        } else
            return true;
    }

    private double getHypot(double x, double y) {
        double s1 = Math.pow(x, 2);
        double s2 = Math.pow(y, 2);
        return Math.sqrt(s1 + s2);
    }
}

1 Ответ

5 голосов
/ 15 марта 2019

Итак, давайте предположим, что радиус равен 1, так что в данном случае, что вы на самом деле делаете:

  1. Создание группы координат x, y в квадрате с координатами (0,0) - (1,1)
  2. Затем вы проверяете, какие из них находятся в круге с центром в (0,0)
  3. Подсчитывая входящие / исходящие счетчики, вы получаете, сколько очков в сегменте круга и сколько за пределами

inCount / (inCount+outCount) представляет отношение в точках к общей поверхности

общая поверхность

Таким образом, вы можете получить приблизительную площадь 1/4 круга по формуле inCount / (inCount+outCount) * r² == pi * r² / 4

Теперь вы можете сказать, что 4 * inCount / (inCount+outCount) == pi

...