最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java利用蒙特卡洛方法求解圓周率π值

 更新時間:2022年08月22日 10:39:03   作者:天人合一peng  
蒙特·卡羅方法(Monte Carlo method),也稱統(tǒng)計模擬方法,是一種以概率統(tǒng)計理論為基礎(chǔ)的數(shù)值計算方法。本文將利用該方法實現(xiàn)圓周率的計算,需要的可以參考一下

一、蒙特卡洛法介紹

蒙特·卡羅方法(Monte Carlo method),也稱統(tǒng)計模擬方法,是一種以概率統(tǒng)計理論為基礎(chǔ)的數(shù)值計算方法,常用于特定條件下的概率計算問題。蒙特卡羅是摩納哥的著名賭城,該法為表明其隨機抽樣的本質(zhì)而命名。

算法思路簡單也好理解:比如拋一枚硬幣,假設我們開始不知道正面朝上的概率是多少,卻有大量的時間來將硬幣拋一萬次,那么在一萬次試驗后,會發(fā)現(xiàn)正面朝上的次數(shù)接近一半,當然,拋的次數(shù)越多,概率越接近50%,蒙特卡洛方法是大數(shù)定律在實際應用問題上的體現(xiàn)。其優(yōu)點十分明顯,基本可以繞開問題本身的“黑盒”,不必考慮問題內(nèi)部的結(jié)構(gòu)而只關(guān)注問題的輸入與輸出,利用輸出的結(jié)果來分析問題,適用于對離散系統(tǒng)進行計算仿真試驗。

例如上例中,我們不用考慮硬幣在空中停留多長時間,不用考慮拋出力度、硬幣大小、空氣阻力、風速等亂七八糟的問題,在大量的試驗后只關(guān)注最后硬幣哪面朝上,就能正確估算出硬幣正面朝上的概率。同樣的,例如我們不知道走到某個路口需要等紅綠燈的概率,不知道某個產(chǎn)品線的合格率,蒙特卡洛法告訴你:模擬一萬次試驗后你就知道了

二、利用蒙特卡洛方法計算圓周率π

采用蒙特卡洛思想,首先在一個正方形區(qū)域內(nèi)隨機生成若干個均勻分布的點,隨后判斷哪些點在正方形的內(nèi)切圓范圍內(nèi)。如果點的數(shù)量足夠多,那么圓內(nèi)點的數(shù)量與點的總數(shù)量的比值,就是圓的面積與正方形面積之比。利用點數(shù)量的比值與正方形面積就可以推出圓的面積,進而得出圓周率π。

三、實現(xiàn)代碼

MTKLExp.java

import java.awt.*;
 
public class MTKLExp {
 
    private int squareSide;
    private int N;
    private int outputInterval = 100;
 
    public MTKLExp(int squareSide, int N){
        if(squareSide <= 0 || N <= 0)
        {
            throw new IllegalArgumentException("squareSide and N must > 0");
        }
 
        this.squareSide = squareSide;
        this.N = N;
    }
 
    public void setOutputInterval(int interval){
        if ( interval <= 0)
        {
            throw new IllegalArgumentException("interval must be > 0");
        }
 
        this.outputInterval = interval;
    }
 
    public void run(){
        Circle circle = new Circle(squareSide/2, squareSide/2, squareSide/2);
        MonteCarloPiData data = new MonteCarloPiData(circle);
 
        for(int i = 0; i < N; i ++){
 
            if( i % outputInterval == 0)
                System.out.println(data.estimatePi());
 
            int x = (int)(Math.random()*squareSide);
            int y = (int)(Math.random()*squareSide);
            data.addPoint(new Point(x, y));
 
        }
    }
 
    public static void main(String[] args){
 
        int squareSide = 800;
        int N = 1000000;
 
        MTKLExp exp = new MTKLExp(squareSide, N);
        exp.setOutputInterval(100);
        exp.run();
    }
}

MonteCarloPiData.java

import java.util.LinkedList;
import java.awt.*;
 
public class MonteCarloPiData {
 
    private Circle circle;
    private LinkedList<Point> points;
    private int insideCircle = 0;
 
    public MonteCarloPiData(Circle circle){
        this.circle = circle;
        points = new LinkedList<Point>();
    }
 
    public Circle getCircle(){
        return circle;
    }
 
    public int getPointsNumber(){
        return points.size();
    }
 
    public Point getPoint(int i){
        if(i < 0 || i >= points.size())
            throw new IllegalArgumentException("out of bound in getPoint!");
 
        return points.get(i);
    }
 
    public void addPoint(Point p){
        points.add(p);
        if(circle.contain(p))
            insideCircle ++;
    }
 
    public double estimatePi(){
 
        if(points.size() == 0)
            return 0.0;
 
        int circleArea = insideCircle;
        int squareArea = points.size();
        return (double)circleArea * 4 / squareArea;
    }
}

Circle.java

import java.awt.*;
import javax.swing.*;
 
public class Circle {
 
    private int x, y, r;
 
    public Circle(int x, int y, int r){
        this.x = x;
        this.y = y;
        this.r = r;
    }
 
    public int getX(){ return x; }
    public int getY(){ return y; }
    public int getR(){ return r; }
 
    public boolean contain(Point p){
        return Math.pow(p.x - x, 2) + Math.pow(p.y - y, 2) <= r*r;
    }
}

以上就是Java利用蒙特卡洛方法求解圓周率π值的詳細內(nèi)容,更多關(guān)于Java蒙特卡洛求圓周率的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringMvc入門指南(必看)

    SpringMvc入門指南(必看)

    下面小編就為大家?guī)硪黄猄pringMvc入門指南(必看)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • springboot引用kettle實現(xiàn)對接oracle數(shù)據(jù)的示例代碼

    springboot引用kettle實現(xiàn)對接oracle數(shù)據(jù)的示例代碼

    這篇文章主要介紹了springboot引用kettle實現(xiàn)對接oracle數(shù)據(jù),其實kettle集成到springboot里面沒有多少代碼,這個功能最主要的還是ktr文件的編寫,只要ktr編寫好了,放到指定文件夾下,寫個定時任務就完事了,需要的朋友可以參考下
    2022-12-12
  • Springboot集成定時器和多線程異步處理操作

    Springboot集成定時器和多線程異步處理操作

    這篇文章主要介紹了Springboot集成定時器和多線程異步處理操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 淺談Spring嵌套事務是怎么回滾的

    淺談Spring嵌套事務是怎么回滾的

    本文主要介紹了Spring嵌套事務是怎么回滾的,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • SpringCloud Gateway 利用 Mysql 實現(xiàn)動態(tài)路由的方法

    SpringCloud Gateway 利用 Mysql 實現(xiàn)動態(tài)路由的方法

    這篇文章主要介紹了SpringCloud Gateway 利用 Mysql 實現(xiàn)動態(tài)路由的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • 兩種Eclipse部署動態(tài)web項目方法

    兩種Eclipse部署動態(tài)web項目方法

    這篇文章主要介紹了兩種Eclipse部署動態(tài)web項目方法,需要的朋友可以參考下
    2015-11-11
  • Mybatis generator自動生成代碼插件實例解析

    Mybatis generator自動生成代碼插件實例解析

    這篇文章主要介紹了Mybatis generator自動生成代碼插件實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • springboot集成普羅米修斯(Prometheus)的方法

    springboot集成普羅米修斯(Prometheus)的方法

    這篇文章主要介紹了springboot集成普羅米修斯(Prometheus)的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • 基于idea 的 Java中的get/set方法之優(yōu)雅的寫法

    基于idea 的 Java中的get/set方法之優(yōu)雅的寫法

    這篇文章主要介紹了基于idea 的 Java中的get/set方法之優(yōu)雅的寫法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • Springboot項目啟動成功后可通過五種方式繼續(xù)執(zhí)行

    Springboot項目啟動成功后可通過五種方式繼續(xù)執(zhí)行

    本文主要介紹了Springboot項目啟動成功后可通過五種方式繼續(xù)執(zhí)行,主要包括CommandLineRunner接口,ApplicationRunner接口,ApplicationListener接口,@PostConstruct注解,InitalizingBean接口,感興趣的可以了解一下
    2023-12-12

最新評論

峡江县| 昌平区| 鄂伦春自治旗| 三门峡市| 石柱| 三亚市| 克东县| 长治县| 天峨县| 宽甸| 梅州市| 河池市| 铅山县| 科尔| 眉山市| 辽宁省| 阿荣旗| 大悟县| 延津县| 巴南区| 佛冈县| 孝感市| 游戏| 黄陵县| 石柱| 留坝县| 璧山县| 辉南县| 井陉县| 尤溪县| 大新县| 桐城市| 丰顺县| 兖州市| 连山| 临夏县| 耿马| 东台市| 拉萨市| 东阿县| 安新县|