圆周率(π)这个东西是从小学开始一直陪伴我们的,这里使用使用蒙特卡洛算法来产生大量的随机数求解π的近似值。
计算方式
首先我们知道 正方形的面积公式是S1 = a * a,圆形的面积S2 = π * r * r;
所以以圆的直径为正方形边长,可以得出π的表达式。
π = 4 * S2 / S1
这样一来,重点就是求解正方形和圆形的面积,这里使用在一正方形区域内圆内产生相应的随机点,
为了便于可视化分析,在圆内和圆外的点分别用不同的颜色来表示,最后圆内产生的点数就近似记作圆的面积,区域内的点数记作正方形的面积。
可视化分析-小数据集
这里用Java swing来求解。
首先看看Circle的model类
public class Circle {
private int x, y, r;
public Circle(int x, int y, int r){
this.x = x;
this.y = y;
this.r = r;
}
public int getX(){ return x; }
public int getY(){ return y; }
public int getR(){ return r; }
// 判断点是否包含在圆内
public boolean contain(Point p){
return Math.pow(p.x - x, 2) + Math.pow(p.y - y, 2) <= r*r;
}
}
这里定义了圆的坐标,以及圆的半径。
然后看看点的model类
public class MonteCarloPiData {
private Circle circle;
private LinkedList<Point> points;
private int insideCircle = 0;
public MonteCarloPiData(Circle circle){
this.circle = circle;
points = new LinkedList<Point>();
}
public Circle getCircle(){
return circle;
}
// 得到点的数量
public int getPointsNumber(){
return points.size();
}