轮盘赌轮 - 计数偶数/奇数条纹没有数组

时间:2016-03-22 01:16:27

标签: java if-statement

我的部分代码遇到了一些问题。我们应该在循环中有一个随机生成器,生成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;
            }
        }
}

如果有人可以检查我的代码并确保我的逻辑是正确的,我真的很感激。

3 个答案:

答案 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个。这些案例是

  • tempEven大于longerEven(目前的条纹是evenns 比最长的连续条纹更长)
  • 找到两个连续的奇数

然而,遗漏的一个案例是在偶数后找到奇数,打破了当前的平均条纹。您的代码确实尝试在两个if语句的else部分处理此问题。但是如果tempEven不大于longerEven,则tempEven永远不会重置为1.如果条纹被破坏,则无论如何都应该重置tempEven。在这种情况下,假设我们在连续8个偶数连续后找到一个奇数。如果longestEven为10,则tempEven将不会重置。如果下一个数字是偶数,那么tempEven仍然不会被重置,因为longestEven仍然更大。然后,假设找到了另一个偶数,应该被破坏的原始条纹继续被添加。如您所见,这可能会导致不准确的条纹数。这种相同类型的逻辑也适用于奇数的条纹。我的建议是使用if-else语句分别处理所有3个案例。使用else if语句,只会执行序列中的一个语句(每个语句代表一个单独的案例),这将真正清理代码。

  • 找到两个连续的偶数(添加到tempEven)
  • 发现一个奇数和一个偶数相邻(检查条纹是否大于目前为止发现的最长条纹并相应更新,然后将临时条纹重置为1)
  • 找到两个连续的奇数(添加到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变量初始化时的值既不关闭也不均匀,因此第一次迭代将正常工作。