話說題目是,用隨機算法求PI,就是圓周那個PI。隨機算法神馬的從來都是用過,沒寫過,這裏隨便貼個線性同餘法
![]()
其中b >= 0,c >= 0,d <= m。d稱爲該隨機序列的種子。如何選取該方法中的常數b、c和m直接關係到所產生的隨機序列的隨機性能。這是隨機性理論研究的內容,已超出本書討論的範圍。從直觀上看,m應取得充分大,因此可取m爲機器大數,另外應取gcd(m, b) = 1,因此可取b爲一素數。
理論的東西,不折騰了,老實說我也不會,這裏直接用c庫裏的rand,種子也不初期化了。
![image 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幾,可能是計算中的誤差問題,也肯能是點數不夠大,。。。就這樣吧。