求PI

来源:互联网 发布:5心的淘宝买家信用 编辑:程序博客网 时间:2024/04/28 16:04

话说题目是,用随机算法求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几,可能是计算中的误差问题,也肯能是点数不够大,。。。就这样吧。