我正在编写一个java程序,模拟滚动两个骰子并在两个骰子没有相同面时递增计数器。经过多次滚动后,我想打印出平均值。
int i = 0;
int count = 0;
double average = 0;
int j = 0;
while (i<1000) {
int dice1 = getRandom(1,6);
int dice2 = getRandom(1,6);
if (dice1 != dice2) {
count++;
}
while (j!= 1000) {
average = (count/j);
j++;
}
i++;
}
System.out.println(average)
程序没有给出平均值,因为我很确定嵌套的while循环是错误的写入的?
getRandom()函数返回1到6之间的随机值,因为骰子可以有6个值。
private static int getRandom(int n1, int n2){
int retVal = 0;
retVal = n1 + (int) Math.floor(Math.random() * (n2 - n1 + 1));
return retVal;
}
我是java的初学者,希望得到一些帮助。
答案 0 :(得分:1)
你的逻辑应该是:
这样的事情:
static final int NUM_ROLLS = 1000;
for (int i=0; i < NUM_ROLLS; ++i) {
int dice1 = getRandom(1,6);
int dice2 = getRandom(1,6);
if (dice1 != dice2) {
count++;
}
}
double average = 1.0*count / NUM_ROLLS;
System.out.println(average)
请注意,在除法乘以1.0
时,要强制进行双精度除法。
我在你的代码中看到的最大的问题是你在循环中取平均值,这没有意义,因为你的非等卷的计数还没有完成。
答案 1 :(得分:1)
更好地命名变量。
i
,请将其称为rolls
count
,请将其称为nonmatching
。然后你会发现你有第三个不必要的变量叫j
,它实际上没有为解决方案提供任何东西(除了当前问题的主要部分)。
以他们为您提供价值的方式命名变量是一件困难的事情。及早开始使用它,在重读代码时比其他任何技能都能节省更多时间。
对于指针,请阅读&#34;故意命名&#34;这意味着,&#34;命名变量如何使用它&#34;而不是显而易见的&#34;按照你想要命名的方式命名它&#34; (我发誓我听说开发人员用那种方式描述它/颤抖/)
是的,您也可以在循环外进行一次计算。但如果你从正确的输入开始,你就会得到正确的答案。