1. 程式人生 > >java基礎演算法學習之概率演算法

java基礎演算法學習之概率演算法

概率演算法是以前一直沒有接觸過的演算法,第一眼看見的時候真的覺得很厲害,這個演算法的思想很簡單但是運用好很難,大概就是將問題轉化為幾何圖形,然後通過點的分佈來求解我們需要的資訊,這裡的例子是求解π,


畫的圖確實有點醜,大概就是以正方形的變長為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;
	}

}