求PI

話說題目是,用隨機算法求PI,就是圓周那個PI。隨機算法神馬的從來都是用過,沒寫過,這裏隨便貼個線性同餘法

    其中b >= 0,c >= 0,d <= m。d稱爲該隨機序列的種子。如何選取該方法中的常數b、c和m直接關係到所產生的隨機序列的隨機性能。這是隨機性理論研究的內容,已超出本書討論的範圍。從直觀上看,m應取得充分大,因此可取m爲機器大數,另外應取gcd(m, b) = 1,因此可取b爲一素數。

 

理論的東西,不折騰了,老實說我也不會,這裏直接用c庫裏的rand,種子也不初期化了。

image

原理是很簡單了,以圓心爲原點,往上面扔隨機點,如果隨機點的個數足夠多,無疑圓心內的點數除以總點數 = (PI * pow(r,2)) / (4 * pow(r,2)) = PI / 4 。所以當n足夠大時,k與n之比就逼近這一概率。從而,PI 約等於 (4*k)/n。看實現:

double get_rand_num() {
    //以圓心作爲原點,隨機點的x軸,y軸的座標
    return rand() / RAND_MAX;
} 

double get_pi(long num = 200000000) {
    int k = 0;
    for (int i=0; i<num; i++) {
        double x = get_rand_num();
        double y = get_rand_num();
        if ((x*x + y*y) < 1.0) {
            k++;
        }
    }
    return (double)4*k / (double)num;
}

不過麼,結果的精確度實在是不咋的,我的機器上跑出來3.9幾,可能是計算中的誤差問題,也肯能是點數不夠大,。。。就這樣吧。

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