java基礎演算法學習之概率演算法
阿新 • • 發佈:2019-02-08
概率演算法是以前一直沒有接觸過的演算法,第一眼看見的時候真的覺得很厲害,這個演算法的思想很簡單但是運用好很難,大概就是將問題轉化為幾何圖形,然後通過點的分佈來求解我們需要的資訊,這裡的例子是求解π,
畫的圖確實有點醜,大概就是以正方形的變長為1,圓形的半徑為1,那麼我知道知道第一象限圓的面積為π/4,然後正方形的面積為1,那麼我們可以通過落入圓形中的點數佔的比例來估計π的值,順便提一句,這個演算法也叫蒙特卡洛概率演算法好了,可以貼程式碼了。
package www.jk.monte; import java.io.InputStreamReader; import java.util.Random; import java.util.Scanner; /** * * @author jk 這個程式演示的是通過概率的方式來求取圓周率,反正我第一看的時候覺得很厲害,首先原點為中心,半徑為1畫一個圓, * 然後在第一象限以原點為左下角畫一個邊長為1的正方形,然後1/4圓和正方形的面積比就是π/4,接下來我們通過函式隨機的產生小於 * 小於1的x,y所構成的n個點,然後我們通過計算出其中落在圓形中的點數和一共的點數來計算出π。 * */ public class Test { public static void main(String[] args) { double PI = 0.0; int n; System.out.println("輸入需要取樣的點的個數"); Scanner input = new Scanner(System.in); n = input.nextInt(); // 呼叫方法來得到PI // invoke the method to get PI PI = montePI(n); System.out.println("PI:" + PI); } public static double montePI(int n) { double PI = 0.0; double x, y; int res = 0; for (int i = 0; i < n; i++) { // 通過函式獲取隨機的x,y // get random x,y x = Math.random(); y = Math.random(); // 如果距離小於1,這說明在圓圈內,結果加1 // if the distance is small than 1,it turns the point is in the // cycle,res+1 if ((x * x + y * y) < 1) { res++; } } // 通過比例算出PI // calculate PI PI = 4.0 * res / n; return PI; } }