蒙特卡洛算法
程序员文章站
2022-07-11 09:09:52
...
浅析蒙特卡洛算法
随机模拟方法,统计实验方法
通过计算机仿真来解决问题的算法
同时可以检验自己模型的正确性
eg:求pi,设圆的半径为1;正方形的边长为2;(pi=落在圆中的概率/落在正方形中的概率*4)
s圆=pi*r*r; s正=4*r*r;
s(圆)/s(正)=pi/4;
pi=s(圆)/s(正)*4;
//matlab代码实现
>> clear all;
n = 100000;
x = unifrnd(-1,1,[1,n]);
y = unifrnd(-1,1,[1,n]);
count = 0;
for i=1:n
if sqrt( abs(x(1,i))*abs(x(1,i))+abs(y(1,i))*abs(y(1,i)) ) < 1.0 %到原点的距离小于1,则在圆内
count = count+1;
end
end
area = 4*1*1*count/n;
//c语言实现
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
void main()
{
double x, y, pi;
int n, k;
srand((unsigned)time(NULL)); //播种随机数,随机产生0-1的小数;
for (n = 1, k = 0; n <= 200000; n++) //将20万个点随机撒在范围x(0~1)和y(0~1)的区域内
{
x = rand() / (double)RAND_MAX;
y = rand() / (double)RAND_MAX;
if (sqrt((x - 0.5)*(x - 0.5) + (y - 0.5)*(y - 0.5)) < 0.5) //比较得出有k个点落在了半径为0.5,圆心(0.5,0.5)的圆内
{
k++;
}
}
pi = k / (0.25 * 200000);
printf("the pi is %7.5lf\n",pi); //根据圆的面积公式近似模拟出pi的值
}
//python实现
import random
def pi(times):
sum=0
for i in range(times):
x=random.random()
y=random.random()
d2=x*x+y*y
if d2<=1:sum+=1
return(sum/times*4)
times=100000000
x=pi(times)
print("Pi=%.8f" % (x))
运行结果:python,matlab,c;
总的来说,蒙特卡洛算法就是一种以概率为理论的计算方法,大量的随机产生数,用频率估计概率。
上一篇: 排列组合
下一篇: JAVA——将一个文件复制到另一个目录下