蒙特卡罗模拟圆周率

蒙特卡罗是一种随机模拟方法,它通过一组随机数(通常是一组非常大的数)来逼近要求的某个值。在《Java语言程序设计—基础》第4章中有个例子是用它来求圆周率,越来越喜欢这本书了 :)。

它的原理是这样的,给定一个正方形,画其内切圆,如下图:



我们在正方形内随机打点,假设整个正方形几乎被我们打满了点,那么落入圆内概率就是:圆面积 / 正方形面积,换成公式就是:pi * r * r / 2r * 2r = pi / 4。当我们模拟一组数据后,求出落在圆内的点的比率,就可以得出一个近似的PI了。Java代码如下 :

class MonteCarloSimulation 
{
	public static void main(String[] args) 
	{
		final int NUMBER_OF_TRIALS = 2000000;
		int numberOfHits = 0;

		for (int i = 0; i < NUMBER_OF_TRIALS; i++)
		{
			// x, y 是落入正方形内点的坐标
			double x = Math.random();  // 书上的代码是 double x = Math.random() * 2 - 1; 但我认为直接用Math.random() 就可以
			double y = Math.random();

			// 如果坐标点: x^2 + y^2 <= 1,就是落入圆内的点坐标
			if (x * x + y * y <= 1)
			{
				numberOfHits++;
			}
		}

		double pi = 4.0 * numberOfHits / NUMBER_OF_TRIALS;
		System.out.println("PI is " + pi);
	}
}

我运行了10次,得到的数据分别为:

PI is 3.141668

PI is 3.144964

PI is 3.139272

PI is 3.141644

PI is 3.141668

PI is 3.137688

PI is 3.144552

PI is 3.138961

PI is 3.144964

PI is 3.144152

看得出,这个值只能算是个近似值了。模拟的数据到了百万级这个值就很接近了,再往上也不会有很大的改善。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值