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++;}
该代码就像一个魅力。