已知:圆的面积公式 S圆=πr2S_圆 = \pi r^2S圆=πr2,正方形的面积公式 : S正=边长2S_正 = 边长^2S正=边长2
假设取两个随机数 x, y,且 x, y ∈ [0, 1),以(x, y)为坐标的点P则在正方形内。如图:
若x2+y2<1\sqrt{x^2+y^2}<1x2+y2<1,表示点P到圆心的距离小于1,则点P落在圆内(90。90^。90。扇形内)。此时正方形边长及圆的半径均等于1。
点P落在扇形内的概率为 p=扇形面积正方形面积=S扇S正=π41=π4p = \frac {扇形面积}{正方形面积} = \frac {S_扇}{S_正} = \frac { \frac {\pi}{4}}{1} = \frac {\pi}{4}p=正方形面积扇形面积=S正S扇=14π=4π
令生成一组随机数称为一次实验,实验m次,有n次点P落在扇形内,落在扇形内的概率为 p=nmp= \frac nmp=mn。若实验次数足够多,则 nm=π4\frac nm = \frac {\pi}{4}mn=4π,即 π=4nm\pi = \frac {4n}{m}π=m4n。下面基于这个结论写代码做实验。
先看实验结果,从运行结果可以看出实验次数越多,πππ值模拟越精确(π=3.141592653589793\color{#F00}{π = 3.141592653589793}π=3.141592653589793)
实验100次,PI=3.0
实验1000次,PI=3.136
实验10000次,PI=3.142
实验100000(10万)次,PI=3.14472
实验1000000(100万)次,PI=3.141712
实验10000000(1000万)次,PI=3.142624
实验100000000(1亿)次,PI=3.14177952
实验1000000000(10亿)次,PI=3.141677952
实验10000000000(100亿)次,PI=3.141618676
实验100000000000(1000亿)次,PI=3.141588773
源代码如下
public static void calculatePI() {
double x;
double y;
long count = 0;//实验总次数
long circle = 0;//点落在圆内的次数
while (count < Math.pow(10, 15)) {//实验次数控制在10^15内
x = Math.random();//随机生成横坐标值 x ∈ [0,1)
y = Math.random();//随机生成纵坐标值 y ∈ [0,1)
count++;//实验次数+1
//如果根号下x^2 + y^2 < 1,则表示该点到圆心的距离小于1,则点在圆内
if (Math.sqrt(x * x + y * y) < 1) {
circle++;
}
boolean isPowOfTen = Math.log10(count) % 1 == 0;//判断实验次数是否为10的n次方
if (count >= 100 && isPowOfTen) {//如果实验次数>=100,且为10的n次方,输出实验结果
System.out.println("实验" + count + "次,PI=" + (4.0 * circle / count));
}
}
}
有兴趣的小伙伴可以试试