求PI

转载 2012年03月26日 23:30:42

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

并行计算中求pi的源程序

  • 2009年05月31日 22:17
  • 717B
  • 下载

看spark示例代码如何求的PI

以前也知道蒙特卡洛投针求PI,今天安装spark,安完先要试试他自带的几个小程序看看能不能用,我主要会用python写程序,也就是pyspark所以在spark里的examples目录深处找pytho...

蒙特卡洛多核并行算法求pi

  • 2010年04月05日 11:57
  • 39KB
  • 下载

求pi的值

  • 2006年02月23日 09:05
  • 1.8MB
  • 下载

OpenMP之数值积分(求圆周率Pi)(sections)

// Pi.cpp : 定义控制台应用程序的入口点。 //求圆周率PI #include "stdafx.h" #include #include #include #include usi...

蒙特卡洛求pi值matlab版

  • 2014年05月23日 22:40
  • 12KB
  • 下载

浦丰投针求pi(Mathmatica)

  • 2010年05月23日 17:27
  • 3KB
  • 下载

算法_随机算法1_入门引例(根据随机数求圆周率pi)

我是野猪。 计算机的使用使我们的计算更加便利,也为一些问题的解决有了新的途径。对于圆周率的求取在计算机中我们可以模拟这样的一个行为,根据点数获取π值,具体的原理如图所示...

用c++语言求Pi

  • 2016年07月27日 16:30
  • 304B
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:求PI
举报原因:
原因补充:

(最多只允许输入30个字)