蒙特卡罗方法:
解决实际问题时会使很多复杂的模型转化为简单易了的运算,很快的得出结果,
m/n=某区域面积/矩形面积
具体要求:
利用大量随机数群进行模拟;
如利用蒙特卡罗方法求pi的值:此处利用的是四分之一单位圆
#include<iostream>
#include<time.h>
#include<stdlib.h>
#include <math.h>
using namespace std;
float shape(float x)
{
return (sqrt(1-x*x));
}
int main()
{
const long max_count = 100000 ;
long undercount = 0;
long totalcount = 0 ;
float rnumx ,rnumy;
float x,val,xrnd,yrnd ,area,boxarea,ymax;
srand(time(NULL));
double pi;
ymax=shape(0);
boxarea=ymax;//矩形面积
while(totalcount<max_count)
{
rnumx=rand();
val = rnumx / RAND_MAX;//产生0-1随机数
xrnd=val;
rnumy=rand();
val=rnumy /RAND_MAX;
yrnd=val*ymax;
if(yrnd<=shape(xrnd))
undercount++;
totalcount++;
}
area= boxarea*(float)undercount/(float)totalcount;//四分之一圆面积
pi=(double)(4*area);
cout<<"pi is :"<<pi<<endl;
return 0;
}
我们直接求pi的值并不是很好求,可能有些常见敞常量的换算可以得到pi,但如果我们不知道那些关系就不是那么好求了,利用蒙特卡罗方法常常可以解决一些统计学问题,如人口,想象到这里可能会让你走上一条想不到的捷径。。。
解决实际问题时会使很多复杂的模型转化为简单易了的运算,很快的得出结果,
m/n=某区域面积/矩形面积
具体要求:
利用大量随机数群进行模拟;
如利用蒙特卡罗方法求pi的值:此处利用的是四分之一单位圆
#include<iostream>
#include<time.h>
#include<stdlib.h>
#include <math.h>
using namespace std;
float shape(float x)
{
return (sqrt(1-x*x));
}
int main()
{
const long max_count = 100000 ;
long undercount = 0;
long totalcount = 0 ;
float rnumx ,rnumy;
float x,val,xrnd,yrnd ,area,boxarea,ymax;
srand(time(NULL));
double pi;
ymax=shape(0);
boxarea=ymax;//矩形面积
while(totalcount<max_count)
{
rnumx=rand();
val = rnumx / RAND_MAX;//产生0-1随机数
xrnd=val;
rnumy=rand();
val=rnumy /RAND_MAX;
yrnd=val*ymax;
if(yrnd<=shape(xrnd))
undercount++;
totalcount++;
}
area= boxarea*(float)undercount/(float)totalcount;//四分之一圆面积
pi=(double)(4*area);
cout<<"pi is :"<<pi<<endl;
return 0;
}
我们直接求pi的值并不是很好求,可能有些常见敞常量的换算可以得到pi,但如果我们不知道那些关系就不是那么好求了,利用蒙特卡罗方法常常可以解决一些统计学问题,如人口,想象到这里可能会让你走上一条想不到的捷径。。。