应届生入职练手习题 [编辑] 模拟射击,根据命中概率来求PI 要求:假设有一个半径为1000的圆形靶子(具体单位没有意义,不用写),我们随意对其进行射击,那么,统计所有落在圆形外接正方形中的弹着点,可以很容易得知:命中这个圆形靶子的概率是圆形的面积与外接方形面积的比 目的:检验编程风格和实现效率
要解这个题目就得有对蒙特卡洛算法的了解,原理如下 在数值积分法中,利用求单位圆的1/4的面积来求得Pi/4从而得到Pi。单位圆的1/4面积是一个扇形,它是边长为1单位正方形的一部分。只要能求出扇形面积S1在正方形面积S中占的比例K=S1/S就立即能得到S1,从而得到Pi的值。怎样求出扇形面积在正方形面积中占的比例K呢?一个办法是在正方形中随机投入很多点,使所投的点落在正方形中每一个位置的机会相等看其中有多少个点落在扇形内。将落在扇形内的点数m与所投点的总数n的比m/n作为k的近似值。P落在扇形内的充要条件是x^2+y^2<=1。(最后这个充要条件其实用的是勾股定理,一开始让我迷惑了有快半小时)
代码实现如下:
import java.util.Scanner;public class MonteCarlomethod { public static void main(String[] args){ int numOfPoints; double PI; System.out.PRintln(" Monte Carlo method/n"); System.out.println(" Input the number of points:/n"); Scanner input = new Scanner(System.in); numOfPoints = input.nextInt(); PI=MonteCarlo(numOfPoints); System.out.println("PI="+PI+"/n"); } static double MonteCarlo(int numOfPoints) { double PI; double x, y; int sum = 0;//落在圆内的点的数量 for(int i = 0; i<numOfPoints; i++) { x = Math.random(); y = Math.random(); if((x*x+y*y)<=1) { sum++; } } PI = 4.0*sum/numOfPoints;//注意是4.0不是4,在这里跌倒过 return PI; }}新闻热点
疑难解答