⑴ c语言程序:用蒙特卡罗法计算直径为1的圆面积。
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>
main(){
intn,i=1,k=1;
floatx,y;
srand(time(0));
printf("Inputn=");
scanf("%d",&n);
while(i<=n){
x=rand()%32767/32767.0;
y=rand()%32767/32767.0;
if(x*x+y*y<=0.25)
k++;
i++;
}
printf("S=%d/%d=%f ",k,n,1.0*k/n*4);
getch();
}
你的随机x,y都是整数
但是你的圆是一个包含4个象限的,你只计算了第一象限
还有x=rand()/32767.0;这个有问题,x可能大于1
⑵ 蒙特卡洛方法是什么
蒙特·卡罗方法(Monte Carlo method),也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。
基本思想:
当所求解问题是某种随机事件出现的概率,或者是某个随机变量的期望值时,通过某种“实验”的方法,以这种事件出现的频率估计这一随机事件的概率,或者得到这个随机变量的某些数字特征,并将其作为问题的解。
蒙特卡罗方法的解题过程可以归结为三个主要步骤:构造或描述概率过程;实现从已知概率分布抽样;建立各种估计量。
以上内容参考:网络——蒙特卡洛方法
⑶ c语言用蒙特卡洛方法求定积分 大佬帮忙看看哪里不对
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
doublejifen(int,int,int,int);
intmain()
{
inta,b,d,n;
doublec;
srand((unsigned)time(NULL));
printf("请输入ab ");
scanf("%d%d",&a,&b);
printf("请输入n ");
scanf("%d",&n);
d=1+b*b;
c=jifen(a,b,d,n);
printf("积分为%lf ",c);
return0;
}
doublejifen(inta,intb,intd,intn)
{
inti,m=0;
doublex,y,result;
for(i=1;i<=n;i++){
x=(double)rand()/(double)(RAND_MAX)*(b-a)+a;
y=(double)rand()/(double)(RAND_MAX)*d;
if(y<=1+x*x)m++;
}
result=(double)m*(b-a)*d/n;
returnresult;
};
如上 使用double 在最后加入result的强制转换
另外在x定义那里,改为(rand/rand_max)*(b-a)+a
因为是a,b 之间的距离随机加a,当a不为0时原来的式子是错的。
⑷ c语言,蒙特卡洛方法求pi。
dty@ubuntu:~$catpi.c
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
intmain()
{
unsignedlongi;
unsignedlongm;
constunsignedlongN=100000000;
doublex,y,pi;
srand((unsigned)time(NULL));
for(i=0,m=0;i<N;i++)
{
/*x,y在区间(-1,1)*/
x=2.0*rand()/RAND_MAX-1;
y=2.0*rand()/RAND_MAX-1;
if((x*x+y*y)<=1)
{
m++;
}
}
pi=4.0*m/N;
printf("%lf ",pi);
return0;
}
dty@ubuntu:~$gccpi.c
dty@ubuntu:~$./a.out
3.141575
⑸ 使用 C++语言并采用蒙特卡洛方法求图 1 中阴影部分的面积,
将图形变换一下,得下图.建立坐标系.利用蒙特卡洛方法求阴影面积如下:
阴影面积=落在阴影部分的坐标点个数÷ 生成的全部坐标点个数×正方形面积
#include<iostream>
#include<iomanip>
#defineMAX_ITERS10000000//生成坐标点总个数
usingnamespacestd;
structPoint
{
doublex,y;
};
doubleRand(doubleL,doubleR)//随机数
{
returnL+(R-L)*rand()*1.0/RAND_MAX;
}
PointgetPoint()//生成坐标点
{
Pointt;
t.x=Rand(-5.0,5.0);
t.y=Rand(-5.0,5.0);
returnt;
}
doublegetResult()//运行
{
intm=0;
intn=MAX_ITERS;
srand(time(NULL));
for(inti=0;i<n;i++)
{
Pointt=getPoint();
doubleres=t.x*t.x+t.y*t.y;
if(res>25){//不在圆内
if(t.x>0&&t.y>0.5*t.x+2.5)//除去斜线以上右上角的点
continue;
else
m++;
}
}
returnm*100.0/MAX_ITERS;
}
intmain()
{
for(inti=0;i<20;i++)
cout<<fixed<<setprecision(6)<<getResult()<<endl;
return0;
}
⑹ 蒙特卡洛算法是什么
蒙特卡洛算法一般指蒙特·卡罗方法,也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。
与它对应的是确定性算法。蒙特·卡罗方法在金融工程学,宏观经济学,计算物理学(如粒子输运计算、量子热力学计算、空气动力学计算)等领域应用广泛。
特点和应用:
通常蒙特·卡罗方法通过构造符合一定规则的随机数来解决数学上的各种问题。对于那些由于计算过于复杂而难以得到解析解或者根本没有解析解的问题,蒙特·卡罗方法是一种有效的求出数值解的方法。一般蒙特·卡罗方法在数学中最常见的应用就是蒙特·卡罗积分。
蒙特卡罗方法在金融工程学,宏观经济学,生物医学,计算物理学(如粒子输运计算、量子热力学计算、空气动力学计算、核工程)等领域应用广泛。
⑺ c语言中用蒙特卡洛法求积分输出info00
#include "stdio.h"
#include "time.h"
#include "math.h"
#include "dos.h"
#define PI 3.1415926
main()
{ double x,y,sum=0;
int i;
for(i=0;i<=100;i++)
{ srand(time(0));
x=rand()%10000;
x=x/10000*PI/2;
sleep(1);
srand(time(0));
y=rand()%10000;
y=y/10000;
if(y<=sin(x)) sum++;
clrscr();
printf("%d%",i);
}
clrscr();
printf("%f ",sum/--i);
}
TC上没问题 VC上有点问题~~~~
⑻ 分别使用辛普森方法与蒙特卡洛方法编写c语言程序求sinx在(0,π)的积分
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#include "math.h"
#define N 50000
int main()
{
double s,x,y;
unsigned num, j;
srand((unsigned) time(NULL));
num=0;
for( j = 0;j < N;j++)
{
x=(double)rand()/(RAND_MAX);
y = (double)rand()/RAND_MAX;
x=x*3.1415926;
if(y<sin(x))
num++;
}
s=((double)num/N)*3.1415926;
printf("%lf\n",s);
return 0;
}
⑼ 蒙特卡洛算法是什么
蒙特卡洛算法一般指蒙特·卡罗方法,也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法。
蒙特卡罗算法并不是一种算法的名称,而是对一类随机算法的特性的概括。举个例子,假如筐里有100个苹果,让我每次闭眼拿1个,挑出最大的。于是我随机拿1个,再随机拿1个跟它比,留下大的,再随机拿1个……我每拿一次,留下的苹果都至少不比上次的小。
拿的次数越多,挑出的苹果就越大,但我除非拿100次,否则无法肯定挑出了最大的。这个挑苹果的算法,就属于蒙特卡罗算法——尽量找好的,但不保证是最好的。
蒙特卡罗是一类随机方法的统称。这类方法的特点是,可以在随机采样上计算得到近似结果,随着采样的增多,得到的结果是正确结果的概率逐渐加大,但在(放弃随机采样,而采用类似全采样这样的确定性方法)获得真正的结果之前,无法知道目前得到的结果是不是真正的结果。