蒙特卡洛随笔
昨日从老师那里学到了蒙特卡洛计算PI的方式,今天自己试验一番,加深印象。
1 package cn.gao.day1019;
2
3 import java.util.Random;
4
5 /**
6 * Monte Carlo模拟计算圆周率π
7 * 在一个平面直角坐标系中,做一个边长为2的正方形,正方形每个和X、Y轴相交的点到原点的距离都是1,在正方形内部做一个内切圆
8 * 则圆的半径也为1;
9 * 圆的面积π*r*r,r=1,所以面积为π,正方形的面积为4,圆和正方形面积比为π/4(无论半径是不是1,都可以约分划掉,用1只是容易计算一些而已)
10 * 蒙特卡洛原理:在正方形内随机足够多的点,如果这些点均匀分布,那么圆内的点应该占到所有点的 π/4,因此将这个比值乘以4,就是π的值
11 */
12 public class MonteCarloDemo {
13 public static void main(String[] args) {
14 int[] arr = {100, 1000, 10000, 100000, 1000000, 10000000, 50000000, 100000000};
15 for (int count : arr) {
16 double pi = 0.0;
17 int points_cicyle = 0;
18 for (int i = 0; i < count; i++) {
19 Random rand = new Random();
20 Double x = rand.nextDouble() * 2 - 1;
21 Double y = rand.nextDouble() * 2 - 1;
22 double distance = Math.sqrt(x * x + y * y);
23 if (distance < 1) {
24 points_cicyle++;
25
26 }
27 }
28 pi = 4.0 * points_cicyle / count;
29 System.out.println("基数为:" + count + "时,PI的值为:" + pi);
30 }
31
32 }
33 }
运行结果如下:
基数为:100时,PI的值为:2.96
基数为:1000时,PI的值为:3.116
基数为:10000时,PI的值为:3.1284
基数为:100000时,PI的值为:3.12764
基数为:1000000时,PI的值为:3.142836
基数为:10000000时,PI的值为:3.1415244
基数为:50000000时,PI的值为:3.14146656
基数为:100000000时,PI的值为:3.14159424
蒙特卡洛实际是概率从概率的角度将复杂的问题简单化了,虽然精度并不是特别高,但从计算难度来讲,无疑是较为简单的一种算法。