首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

蒙特卡洛法求Pi

蒙特卡洛法求Pi

编程实现如下模拟:


飞镖被随机地投掷到以(1,1)和(-1,-1)为对角的正方形内。若飞镖落在单位圆内【即以(0,0)为圆心,1为半径的圆】,算命中。否则未命中。


运行这个模拟并用它求PI的近似值。




模型如下图所示:




[cpp] view plain copy


  • // Circle_PI.cpp : 定义控制台应用程序的入口点。
  • //

  • #include <iostream>
  • #include <cstdlib>
  • #include <ctime>
  • #include <iomanip>

  • using
    namespace std;  

  • const
    int MAX_DAST=100000;      //投掷总数

  • double rand_double(double a,double b);  

  • void rand_seed();               //设置随机数的种子

  • int main(void)  
  • {  

  •     int PI_DAST=0;  //投掷在圆里面的总数

  •     rand_seed();  

  •     for(int i=0;i<MAX_DAST;i++)  
  •     {  
  •         double x=rand_double(-1,1);  
  •         double y=rand_double(-1,1);  
  •         if( x*x+y*y<=1)  
  •             PI_DAST++;  
  •     }  

  •     double PI=PI_DAST*4.0/MAX_DAST;  

  •     cout<<fixed;  

  •     cout<<"PI="<<PI<<endl;  

  •     system("pause");  

  •     return 0;  
  • }  

  • /**
  •     生成某一区域内的随机浮点数
  •     @param a 该区域的下边界
  •     @param b 该区域的上边界
  •     @param return 随机浮点数x,x∈[a,b]
  • */
  • double rand_double(double a,double b)  
  • {  
  •     return a+(b-a)*rand()*1.0/RAND_MAX;  
  •     /*
  •     RAND_MAX是VC中stdlib.h中宏定义的一个字符常量:  
  •     #define RAND_MAX 0x7FFF  
  •     其值最小为32767,最大为2147483647   
  •     通常在产生随机小数时可以使用RAND_MAX。
  •     */
  • }  

  • /**
  •     设置随机数生成器的种子
  • */
  • void rand_seed()  
  • {  
  •     int seed=static_cast<int>(time(0));               //返回的是系统的时间
  •     srand(seed);  
  •     /*
  •     rand()产生伪随机数。srand函数提供种子,种子不同产生的随机数序列也不同,所以通常先调用srand函数,将time(0)的结果设置成种子。
  •     srand函数是随机数发生器的初始化函数。
  •     */
  • }  
返回列表