码迷,mamicode.com
首页 > 其他好文 > 详细

蒙特卡洛方法估算圆周率

时间:2020-04-27 15:49:06      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:范围   data-   获取   span   工程设计   最小值   计算方法   ffffff   ali   

圆周率的近似计算方法
      使用蒙特卡洛方法估算圆周率,具体思路如下:
      思考一个边长为 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;//返回的是估计的圆周率
    }

 

蒙特卡洛方法估算圆周率

标签:范围   data-   获取   span   工程设计   最小值   计算方法   ffffff   ali   

原文地址:https://www.cnblogs.com/Object-Oriented-Design-and-Analysis/p/12786604.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!