蒙特卡罗法
蒙特卡罗法的基本思想是:为了求解问题,首先建立一个概率模型或随机过程,使它的参数或数字特征等于问题的解:然后通过对模型或过程的观察或抽样试验来计算这些参数或数字特征,最后给出所求解的近似值。解的精确度用估计值的标准误差来表示。蒙特卡罗法的主要理论基础是概率统计理论,主要手段是随机抽样、统计试验。用蒙特卡罗法求解实际问题的基本步骤为:
(1)根据实际问题的特点.构造简单而又便于实现的概率统计模型.使所求的解恰好是所求问题的概率分布或数学期望;
(2)给出模型中各种不同分布随机变量的抽样方法;
(3)统计处理模拟结果,给出问题解的统计估计值和精度估计值。
该方法的思想是利用计算机随机数的功能,通过计算落在单位圆内的点与落在正方形内的点的比值计算PI。
由于图形的对称性,所以这里我们只需要考虑该图形的四分之一部分。
假定一点能够均匀地扔到一个正方形中,计算落入其中的点个数。通过计数其中落入内切圆的点的个数;
如果一共投入N个点,其中有M个落入圆中,则只要点均匀,假定圆周的半径为R,则:
代码部分
package com.zmz.countPI; /** * @ProjectName: PI * @Package: com.zmz.countPI * @ClassName: RandomPI * @Author: 张晟睿 * @Date: 2021/10/20 10:24 * @Version: 1.0 */ public class RandomPI { public static double rand_pi(int n) { int numInCircle = 0; double x, y; double pi; for(int i=0;i < n; i++){ x = Math.random(); y = Math.random(); if(x * x + y * y < 1) numInCircle++; } pi = (4.0 * numInCircle) / n; return pi; } public static void main(String[] args) { System.out.println(rand_pi(10)); //改变参数值 System.out.println(rand_pi(100)); //改变参数值 System.out.println(rand_pi(1000)); //改变参数值 System.out.println(rand_pi(10000)); //改变参数值 System.out.println(rand_pi(100000)); //改变参数值 System.out.println(rand_pi(1000000)); //改变参数值 System.out.println(rand_pi(10000000)); //改变参数值 System.out.println(rand_pi(100000000)); //改变参数值 System.out.println(rand_pi(1000000000)); //改变参数值 } }
测试结果:
次数 | 10 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 |
估计值 | 4.0 | 3.12 | 3.188 | 3.1584 | 3.1346 | 3.142204 | 3.1414108 | 3.14141952 | 3.141542752 |
可以看出来,该方法投入点的个数越大,越接近真实值。