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

相关文章推荐

OpenMP 之reduction 子句求数值积分圆周率(pi)(学习笔记)

OpenMP 并行求数值reduction 子句求数值积分圆周率(pi)方法 开启两个并行线程程序如下:

求pi的值

  • 2006-02-23 09:05
  • 1.80MB
  • 下载

用java的BigDecimal实现求PI(算法一)

用java的BigDecimal实现求PI运行截图: 所用公式: 源代码://默认输出小数点后30位 import java.math.BigDecimal;public class Ca...

蒙特卡洛求pi值matlab版

  • 2014-05-23 22:40
  • 12KB
  • 下载

蒙特卡洛法求Pi

编程实现如下模拟:飞镖被随机地投掷到以(1,1)和(-1,-1)为对角的正方形内。若飞镖落在单位圆内【即以(0,0)为圆心,1为半径的圆】,算命中。否则未命中。运行这个模拟并用它求PI的近似值。 模型...
  • smsmn
  • smsmn
  • 2011-04-21 16:05
  • 1087

用c++语言求Pi

  • 2016-07-27 16:30
  • 304B
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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