今天看书看到了随机数的生成,于是想起上学时室友给我谈过的一个问题:
如何编写代码尽可能准确地输出圆周率pi?阐述思路即可。
起初我听到这个问题的时候是一头雾水的,还好室友给我分享了一个思路:
蒙特卡洛方法,说直白点就是在一个正方形区域内随机生成点,判断哪些点落在了其内切圆中,通过这些这些点和所有点的数量之比来计算出圆周率pi。当然随机生成的点数越多,结果越接近pi。
参考下图,需要统计落在红色圆内的点数和落在黑色方框内的点数之比,令这个比值等于圆和方框的面积比,进而计算出pi
代码如下:
import java.util.*;
import java.text.*;
import java.math.*;
public class AskPi{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
NumberFormat nf = NumberFormat.getNumberInstance();
// 保留十位小数
nf.setMaximumFractionDigits(10);
// 如果不需要四舍五入,可以使用RoundingMode.DOWN
nf.setRoundingMode(RoundingMode.DOWN);
System.out.println("输入随机测试次数:");
int times = sc.nextInt();
int num = 0;
double x = 0;
double y = 0;
double d = 0;
for(int i=0;i<times;i++){
x = Math.random()*2;
y = Math.random()*2;
d = (x-1)*(x-1)+(y-1)*(y-1);
if(d<=1){
num = num + 1;
}
}
double pi = (double)4*num/times;
System.out.println("Pi = " + nf.format(pi));
}
}
过程中遇到的问题是不知道如何输出多位小数的double类型变量。
百度了一下,网上有总结很全的资料:
https://blog.csdn.net/pbm863521/article/details/54134482/
https://www.cnblogs.com/dichuan/p/7769098.html
最后再附一张丑陋的草稿图: