蒙特卡洛算法求圓周率

遇到一個算法面試題,要求通過程序求出圓周率。作爲數學渣的我,瞬間懵逼。
於是翻看其他大佬們對於圓周率的計算方式,看到一個比較好理解的算法:蒙特卡洛算法。
圓與外接正方形
如上圖,外接正方形的面積S1 = 4 * R^2;圓的面積S2 = PI * R^2。
因此,一個隨機點A(x,y|x∈[-1,1],y∈[-1,1]),P(落到圓裏的概率) = PI / 4;
因此,圓周率 PI = 4 * P(落到圓裏的概率)。
而當圓的半徑爲1時,圓上所有點到圓心的長度都不會超過1;
因此設圓心爲O,向量OA的模長 √(x^2 + y^2) <= 1;
也就是說,當 x^2 + y^ <= 1 時,就表示當前隨機點A是落在圓裏的。
綜上所述,只要統計足夠多的次數,就能大致推算出圓周率 PI 的值了。

/**
 * Classname: Test
 * Date: 2020/05/31 18:56
 */
public class Test {
    public static void main(String[] args) {
        int hitNum = 0;
        for (int i = 1; i < 10000000; i++) { // 統計一百萬次
            double x = Math.random(); // 返回介於0(包含) ~ 1(不包含)之間的一個隨機數
            double y = Math.random(); // 返回介於0(包含) ~ 1(不包含)之間的一個隨機數
            if ((Math.pow(x, 2d) + Math.pow(y, 2d)) <= 1d) {
                hitNum++; // 當 x^2 + y^2 <= 1 時,就表示當前隨機點是落在圓裏的
            }
        }
        double PI = hitNum / 10000000d * 4; // PI = 4 * P(落到圓裏的概率)
        System.out.println(PI);
    }
}

輸出結果如下,可以看到,取到的是一個比較近似的值:
圓周率求得值

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章