Solution - Monte Carlo Simulation for π

Problem.

write a Java program to use Monte Carlo Simulation to estimate the value of π.

写一个Java程序,用蒙特卡洛模拟近似计算π的值。

Solution.

  • 在一个单位正方形里随机投掷一个点,如果该点处在以原点为中心、半径为1的四分之一圆里,则为一次成功投掷。
  • 易得成功投掷的概率为四分之一单位圆的面积,π/4。(如图所示)

Fig. 1. 蒙特卡洛模拟近似计算π

  • 如果投掷点在单位圆内(成功投掷),其距离原点的距离小于1;
  • 重复随机投掷n次,令成功投掷的次数为m,那么模拟求得的π = 4 * m / n.

MonteCarloForPi.java

public class MonteCarloForPi {

	public static void main(String[] args) {

		int totalNum = 5000000;  // 总投掷次数
		Random rand = new Random(); // 创建生成随机数的对象
		int successfulNum = 0; // 记录成功投掷次数的变量
		double x, y;    // 投掷点的坐标
		for (int i = 0; i < totalNum; i++) {
			x = rand.nextDouble(); // 随机生成(0,1)内的x坐标
			y = rand.nextDouble(); // 随机生成(0,1)内的y坐标
			if (len(x, y) < 1) {  // 如果其距原点的距离小于1,则成功投掷次数+1
				successfulNum++;
			}
		}
		System.out.println("Estimated Pi = " + 4 * successfulNum / (double) totalNum);
	}

	static double len(double x1, double y1) {
		return Math.sqrt(Math.pow(x1, 2) + Math.pow(y1, 2));
	}

}