當前位置:首頁 » 編程語言 » C語言蒙特卡洛法
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

C語言蒙特卡洛法

發布時間: 2022-09-11 04:25:18

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次,否則無法肯定挑出了最大的。這個挑蘋果的演算法,就屬於蒙特卡羅演算法——盡量找好的,但不保證是最好的。

蒙特卡羅是一類隨機方法的統稱。這類方法的特點是,可以在隨機采樣上計算得到近似結果,隨著采樣的增多,得到的結果是正確結果的概率逐漸加大,但在(放棄隨機采樣,而採用類似全采樣這樣的確定性方法)獲得真正的結果之前,無法知道目前得到的結果是不是真正的結果。