我的部分代码遇到了一些问题。我们应该在循环中有一个随机生成器,生成1,000,000个随机数。之后,我们必须有一个计数器,计算最长的平均值和赔率,并将其与1/37 *(n-1)(预期重复次数)和(1/37)^ 2 *(n-1)进行比较)(预期的三个蛋糕的数量)。我们还没有学过数组,所以他希望我们完成没有数组的赋值。它似乎正确地产生了条纹,然而,当你仔细观察时我的数字一直很高(例如,当每个公式的预期条纹是19时,我产生了29条连条)。如果发电机是真正随机的,它应该更接近预期的数量。我在下面提供了我的代码:
for(int i = 1; i <= 1000000; i++) {
int randomNumber = gen.nextInt(37);
wheel.setNumber(randomNumber);
String numberColor = wheel.getColor();
//COUNTS THE LONGEST STRING OF EVENS
if ((lastNum % 2 == 0) && (randomNumber % 2 == 0) && randomNumber != 0 && lastNum != 0) {
tempEven++;
tempOdd = 1;
} else {
if (tempEven > longestEven) {
longestEven = tempEven;
tempEven = 1;
}
}
//COUNTS THE LONGEST STRING OF ODDS
if ((lastNum % 2 == 1) && (randomNumber % 2 == 1) && randomNumber != 0 && lastNum != 0) {
tempOdd++;
tempEven = 1;
} else {
if (tempOdd > longestOdd) {
longestOdd = tempOdd;
tempOdd = 1;
}
}
}
如果有人可以检查我的代码并确保我的逻辑是正确的,我真的很感激。
答案 0 :(得分:0)
您使用if
语句的方式存在问题:
if ((lastNum % 2 == 0) && (randomNumber % 2 == 0) && randomNumber != 0 && lastNum != 0) {
tempEven++;
tempOdd = 1;
} else {
if (tempEven > longestEven) {
longestEven = tempEven;
tempEven = 1;
}
}
这里假设如果条件为false
,则表示randomNum
为奇数,情况并非如此(例如lastNum
为奇数,randomNum
为甚至会返回false
)。第二个if
声明也是如此。
这样的事情会起作用:
if(randomNum is even) {
if(lastNum is even) {
//...
} else {
//...
}
} else {
if(lastNum is even) {
//...
} else {
//...
}
}
答案 1 :(得分:0)
从我可以收集到的内容来看,您似乎只是将tempEven重置为2个案例中的1个。这些案例是
然而,遗漏的一个案例是在偶数后找到奇数,打破了当前的平均条纹。您的代码确实尝试在两个if语句的else部分处理此问题。但是如果tempEven不大于longerEven,则tempEven永远不会重置为1.如果条纹被破坏,则无论如何都应该重置tempEven。在这种情况下,假设我们在连续8个偶数连续后找到一个奇数。如果longestEven为10,则tempEven将不会重置。如果下一个数字是偶数,那么tempEven仍然不会被重置,因为longestEven仍然更大。然后,假设找到了另一个偶数,应该被破坏的原始条纹继续被添加。如您所见,这可能会导致不准确的条纹数。这种相同类型的逻辑也适用于奇数的条纹。我的建议是使用if-else语句分别处理所有3个案例。使用else if语句,只会执行序列中的一个语句(每个语句代表一个单独的案例),这将真正清理代码。
找到两个连续的奇数(添加到tempOdd)
for(int i = 1; i <= 1000000; i++) {
int randomNumber = gen.nextInt(37);
wheel.setNumber(randomNumber);
String numberColor = wheel.getColor();
//COUNTS THE LONGEST STRING OF EVENS
if ((lastNum % 2 == 0) && (randomNumber % 2 == 0) && randomNumber != 0 && lastNum != 0) {
tempEven++;
}
//ONCE A STREAK IS BROKEN BY FINDING A ODD NUM AFTER A EVEN NUM
//OR A EVEN NUM AFTER A ODD NUM
//THIS ELSE IF STATEMENT COULD BE SEPARATED INTO TWO ELSE IF STATEMENTS
//BUT IT IS MEANT TO ILLUSTRATE A CASE
else if(((lastNum % 2 != 0 && randomNumber % 2 == 0) || (lastNum % 2 == 0 && randomNumber % 2 != 0)) && (randomNumber != 0 && lastNum != 0)){
if(tempEven > longestEven){
longestEven = tempEven;
}
if(tempOdd > longestOdd){
longestOdd = tempOdd;
}
//streak should be reset no matter what once this case is found
tempEven = 1;
tempOdd = 1;
}
//COUNTS THE LONGEST STRING OF ODDS
else if ((lastNum % 2 == 1) && (randomNumber % 2 == 1) && randomNumber != 0 && lastNum != 0) {
tempOdd++;
tempEven = 1;
}
}
答案 2 :(得分:0)
我认为你的主要问题是代码太多了。试试这个:
int longestEvenRun = 0, longestOddRun = 0, evenRun = 0, oddRun = 0, last = -1;
for (int i = 0; i < 1000000; i++) {
int randomNumber = gen.nextInt(37);
int odd = randomNumber & 1; // 1 if odd, 0 if even
if (odd == last) {
longestOddRun = Math.max(++oddRun, longestOddRun);
evenRun = 0;
} else {
longestEvenRun = Math.max(++evenRun, longestEvenRun);
oddRun = 0;
}
last = odd;
}
这里唯一可能需要解释的是randomNumber & 1
,它使用1
对随机数进行按位AND来屏蔽除最低位之外的所有位,即1
关闭数字和偶数的0
。这样做大大简化了逻辑。请注意,last
变量初始化时的值既不关闭也不均匀,因此第一次迭代将正常工作。