欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

一、蒙特卡洛法介紹

蒙特·卡羅方法(Monte Carlo method),也稱統(tǒng)計模擬方法,是一種以概率統(tǒng)計理論為基礎的數(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)文章

  • spring retry 配置及使用教程

    spring retry 配置及使用教程

    這篇文章主要介紹了spring retry 配置及使用教程,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-01-01
  • 詳解Spring Boot 目錄文件結(jié)構(gòu)

    詳解Spring Boot 目錄文件結(jié)構(gòu)

    這篇文章主要介紹了Spring Boot 目錄文件結(jié)構(gòu)的相關(guān)資料,文中示例代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • java 數(shù)據(jù)結(jié)構(gòu)之刪除鏈表中的元素實例代碼

    java 數(shù)據(jù)結(jié)構(gòu)之刪除鏈表中的元素實例代碼

    這篇文章主要介紹了java 數(shù)據(jù)結(jié)構(gòu)之刪除鏈表中的元素實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • mybatis-plus指定字段模糊查詢的實現(xiàn)方法

    mybatis-plus指定字段模糊查詢的實現(xiàn)方法

    最近項目中使用springboot+mybatis-plus來實現(xiàn),所以下面這篇文章主要給大家介紹了關(guān)于mybatis-plus實現(xiàn)指定字段模糊查詢的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • Java編程—在測試中考慮多態(tài)

    Java編程—在測試中考慮多態(tài)

    這篇文章主要介紹了Java編程—在測試中考慮多態(tài),具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Java中的Semaphore信號量深入解析

    Java中的Semaphore信號量深入解析

    這篇文章主要介紹了Java中的Semaphore信號量深入解析,Semaphore是Java里面另外一個基本的并發(fā)工具包類,主要的的作用是用來保護共享資源的訪問的,也就是僅僅允許一定數(shù)量的線程訪問共享資源,需要的朋友可以參考下
    2023-11-11
  • spring?retry實現(xiàn)方法請求重試的使用步驟

    spring?retry實現(xiàn)方法請求重試的使用步驟

    這篇文章主要介紹了spring?retry實現(xiàn)方法請求重試及使用步驟,本文分步驟通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • HashMap底層數(shù)據(jù)結(jié)構(gòu)詳細解析

    HashMap底層數(shù)據(jù)結(jié)構(gòu)詳細解析

    這篇文章主要介紹了HashMap底層數(shù)據(jù)結(jié)構(gòu)詳細解析,HashMap作為開發(fā)中常用的數(shù)據(jù)結(jié)構(gòu),也是面試中經(jīng)常被問的知識點,因此作為開發(fā)者應該盡可能多的理解其底層的數(shù)據(jù)結(jié)構(gòu),需要的朋友可以參考下
    2023-11-11
  • MyBatis攔截器分表實踐分享

    MyBatis攔截器分表實踐分享

    部門內(nèi)有一些億級別核心業(yè)務表增速非???增量日均100W,但線上業(yè)務只依賴近一周的數(shù)據(jù),隨著數(shù)據(jù)量的迅速增長,慢SQL頻發(fā),數(shù)據(jù)庫性能下降,系統(tǒng)穩(wěn)定性受到嚴重影響,本篇文章,將分享如何使用MyBatis攔截器低成本的提升數(shù)據(jù)庫穩(wěn)定性,需要的朋友可以參考下
    2024-01-01
  • Springboot+redis+Vue實現(xiàn)秒殺的項目實踐

    Springboot+redis+Vue實現(xiàn)秒殺的項目實踐

    本文主要介紹了Springboot+redis+Vue實現(xiàn)秒殺的項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08

最新評論