Professor's equation for the boolean condition that satisfies "hitPointsCounter" in my code

在Java类中,我负责解决几何区域的几种蒙特卡洛近似。我的第一个实验是,我有一个名为“条件”的布尔值运行一个do-while循环,该循环在(误差
当我将“ while”语句从布尔值更改为计数器时,我可以使其正常运行,因此我知道布尔值本身存在问题。

如果要求我求解高度为2 ^(-0.5)的正方形的面积从0到1的问题,那么教授给我的增加hitPointsCounter变量的条件将很好地起作用,但不使用方程y = 2 ^( -0.5)x-所以我即兴创作并注意到,要使点在直线上或直线下方,必须满足x / y> = 2 ^ 0.5。

有人可以给我一些关于我可能搞砸了的反馈吗?我的问题是在切换案例1和中断之间。

    public static void main(String[] args){




    double tolerance = 1E-9, referenceArea =0.0, exactArea =0.0, x =0.0,     y =0.0, error = 0.0, approximateArea = 0.0;
    int  totalPointsCounter =0, hitPointsCounter =0;
    char firstCharacter ;
    String titleText, messageText;

    titleText = "The Monte Carlo Method";

    int userInput = JOptionPane.showConfirmDialog(null, "Run a Monte Carlo Experiment?", titleText, JOptionPane.YES_NO_OPTION);
    if (userInput == 1){
        JOptionPane.showMessageDialog(null, "The program terminates \nGood Bye!", titleText,  JOptionPane.WARNING_MESSAGE);
    System.exit(0);

    }


    String userExperimentInput = JOptionPane.showInputDialog(null, "Please Enter\n1 for Experiment 1\n2 for Experiment 2\n3 for Experiment 3\n4 for Experiment 4", titleText,  JOptionPane.QUESTION_MESSAGE).trim();

      if(userExperimentInput == null || userExperimentInput.equals("") ){
        JOptionPane.showMessageDialog(null, "No input received\nThe program terminates", titleText,  JOptionPane.WARNING_MESSAGE);
        System.exit(0);
      }
char theCase = userExperimentInput.charAt(0);



switch (theCase){
    case '1':
        exactArea = Math.pow(2, -0.5)*1/2;
        referenceArea = 1.0;


         boolean condition = error < tolerance;

         double percentHit = (((double)hitPointsCounter/(double)totalPointsCounter));
   approximateArea =(percentHit)*(referenceArea);
error = exactArea - Math.abs(approximateArea);

int counter = 0;

do {
        x= Math.random();
        y= Math.random();
        totalPointsCounter++;

        if (y==0 && x==0){hitPointsCounter++;}
        if (y>0){
        if ((x/y)>=Math.pow(2, 0.5)){

                hitPointsCounter++;}
        }

        exactArea = Math.pow(2, -0.5)*1/2;
        referenceArea = 1.0;




        counter++;

        }

while(condition);

  percentHit = (((double)hitPointsCounter/(double)totalPointsCounter));
   approximateArea =(percentHit)*(referenceArea);
error = exactArea - Math.abs(approximateArea);



messageText ="Experiment #1" + ": \n\nMC needed " + totalPointsCounter + " random points for tolerance " + tolerance + "\nThe approximate area is " + approximateArea;

JOptionPane.showMessageDialog(null, messageText, titleText, JOptionPane.INFORMATION_MESSAGE);

break;



    case 2:
        exactArea = Math.PI;
        referenceArea = 4.0;







    case 3:
        exactArea = (1.0/3.0);
        referenceArea = 2.0;







    case 4:
        exactArea = 2;
        referenceArea = Math.PI;





    default:
        System.out.println("Wrong character for case number, program terminates");
        System.exit(0);
}

}

最佳答案

所以我让代码工作了,问题是双重的-我的代码没有重新评估循环中的布尔“条件”,从而导致无限循环,而我以前定义hitPointCounter的方式是不正确的。谢谢Damon的帮助。当我添加此块时:

           percentHit =   (((double)hitPointsCounter/(double)totalPointsCounter));
           approximateArea =(percentHit)*(referenceArea);
           error = Math.abs(exactArea - approximateArea);
           condition = error > tolerance;


在我的循环内并改变了

     if (y==0 && x==0){hitPointsCounter++;}
     if (y>0){
     if ((x/y)>=Math.pow(2, 0.5)){

            hitPointsCounter++;}
    }


至:

if (y<(Math.pow(2,-0.5)*x)){

                hitPointsCounter++;}


该代码就像一个魅力。

08-07 00:53