蒙特卡洛方法估算圆周率
Posted object-oriented-design-and-ana
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蒙特卡洛方法估算圆周率相关的知识,希望对你有一定的参考价值。
圆周率的近似计算方法
使用蒙特卡洛方法估算圆周率,具体思路如下:
思考一个边长为 s 的正方形,它的内接圆和正方形的面积之比为 πr2/4 r2 = π/4。由此可以在正方
形的面积范围内产生大量(n 个,需要足够大)随机的点,再统计这些点在圆的范围内的数量 m。则
π/4 = m/n,由此可估算 π 的值。
工程设计思路
在平面直角坐标系内随机选取一个坐标点,假定该坐标点为矩形左上角的位置,同时输入该矩形的
长和宽,由于本例中要求矩形为正方形,所以必须要求输入的该矩形场合宽务必相等,以上均为系
统的输入。
据此,可以求出该正方形内接圆的圆心坐标点及半径。然后就可以通过随机数方法获取落于正方
形之内的坐标点,同时统计落在圆内的点的个数,由此就可以估算出 π 的值。
做题准备:(随机数的产生)
已知矩形的左上角坐标(Abscissa,Ordinate)以及长Length宽Width,在该矩形范围内产生n个随机数。由于Math.radom()是随机产生(0,1)之间的随机数,故(最小值,最大值)之间的随机数=Math.radom()*(最大值-最小值)-最小值。
该题的横坐标范围是(Abscissa,Abscissa+Length),纵坐标范围是(Ordinate-Width,Ordinate),由此可以知道落于正方形之内的坐标点x=Math.random()*(Length)+Absciss与 y=Math.random()*(Width)+(Ordinate-Width)
public double simulation(int count) {// 模拟 int s=0; MonteCarloSimulation w=new MonteCarloSimulation(rectangle); double r1=w.getRectangle().getCoordinate().getAbscissa()+w.getRectangle().getLength()/2;//由左上角坐标和长宽获得圆心的横坐标 double r2=w.getRectangle().getCoordinate().getOrdinate()-w.getRectangle().getWidth()/2;//获得圆心的纵坐标 for (int i=0;i<count;i++) { double x=Math.random()*(w.getRectangle().getLength())+w.getRectangle().getCoordinate().getAbscissa();//随机产生落入矩形范围内横坐标 double y=Math.random()*(w.getRectangle().getWidth())+(w.getRectangle().getCoordinate().getOrdinate()-w.getRectangle().getWidth());//随机产生落入矩形范围内的纵坐标 if (Math.sqrt((x-r1)*(x-r1)+(y-r2)*(y-r2))<w.getRectangle().getWidth()/2)//如果随机产生的点到圆心的距离小于圆的半径 s++; //计数器加一 } return (double)4*s/count;//返回的是估计的圆周率 }
以上是关于蒙特卡洛方法估算圆周率的主要内容,如果未能解决你的问题,请参考以下文章