关闭

求PI

标签: 算法c
485人阅读 评论(0) 收藏 举报
分类:

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:76896次
    • 积分:1348
    • 等级:
    • 排名:千里之外
    • 原创:58篇
    • 转载:9篇
    • 译文:0篇
    • 评论:13条
    文章分类
    最新评论