蒙特卡洛方法
首先从一个简单的例子入手,我们如何从概率的角度求得近似的PI?
一个不难理解的方法,我们向一个区域投球这个区域有个子区域,球落到子区域的概率是子区域与整个区域的比值。
由此,我们可以想到假设我们向一个边长为2的正方形区域投球,投到他最大内切圆的概率是(便于计算):圆的面积比上正方形面积在这个假设下的概率是PI/(2*2),由大数定律,我们都知道事情发生的频率随着事件规模n的增大无限接近事件的概率。由此我们可以不断的抛球,重复次数足够多后可以得到较为接近概率的频率,我们可以将这个频率看成概率带入公式即乘4就是所求的PI的近似值。基本java 代码如下:
double n =sc.nextLong();
long count=0;
x=Math.random()*2.0;
y=Math.random()*2.0;
if ( Math.pow(x-1,2)+ Math.pow(y-1,2)<=1)
count ++;
System.out.println("PI="+String.format("%10f",4.0*count/n));
结果:
所谓蒙特卡洛方法的基本思想就是:当所求解问题是某种随机事件出现的概率,或者是某个随机变量的期望值时,通过某种“实验”的方法,以这种事件出现的频率估计这一随机事件的概率,或者得到这个随机变量的某些数字特征,并将其作为问题的解。(百度百科)
基本上就是通过频率估计近似得到概率,根据概率的理论公式算出索要求的某个量。
所以蒙特卡洛的基本步骤:
1、构造概率描述步骤
例如上文例子中把求PI转化为投球的频率来描述投球概率
2、 实现从已知概率分布抽样
上文已知投球的点的坐标(x,y)随机取样(取0-2的随机数)
3、建立各种估计量
PI