欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

蒙特卡洛算法

程序员文章站 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;

蒙特卡洛算法蒙特卡洛算法蒙特卡洛算法

 

总的来说,蒙特卡洛算法就是一种以概率为理论的计算方法,大量的随机产生数,用频率估计概率。