话说题目是,用随机算法求PI,就是圆周那个PI。随机算法神马的从来都是用过,没写过,这里随便贴个线性同余法
其中b >= 0,c >= 0,d <= m。d称为该随机序列的种子。如何选取该方法中的常数b、c和m直接关系到所产生的随机序列的随机性能。这是随机性理论研究的内容,已超出本书讨论的范围。从直观上看,m应取得充分大,因此可取m为机器大数,另外应取gcd(m, b) = 1,因此可取b为一素数。
理论的东西,不折腾了,老实说我也不会,这里直接用c库里的rand,种子也不初期化了。
原理是很简单了,以圆心为原点,往上面扔随机点,如果随机点的个数足够多,无疑圆心内的点数除以总点数 = (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几,可能是计算中的误差问题,也肯能是点数不够大,。。。就这样吧。