首页 > 技术文章 > 蒙特卡洛随笔

javagao 2020-10-19 17:04 原文

昨日从老师那里学到了蒙特卡洛计算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

 

蒙特卡洛实际是概率从概率的角度将复杂的问题简单化了,虽然精度并不是特别高,但从计算难度来讲,无疑是较为简单的一种算法。 

 

推荐阅读