Java 修复无限循环?

Java 修复无限循环?,java,eclipse,numbers,infinite-loop,Java,Eclipse,Numbers,Infinite Loop,我是理工科一年级的学生,在课堂上我们有一个项目,我们为游戏制作了一个叫做“百吉饼”的算法。我们要随机制作一个3位数的数字,但所有数字都不能是相同的数字。所以像“100、220、343和522”这样的数字是非法的,因为它们包含的数字是相同的 我决定最好分别生成每个数字,比较每个数字并根据需要进行更改,然后将每个数字添加到字符串中。这是我的密码: Scanner input = new Scanner(System.in); // Generate a random 3 digit num

我是理工科一年级的学生,在课堂上我们有一个项目,我们为游戏制作了一个叫做“百吉饼”的算法。我们要随机制作一个3位数的数字,但所有数字都不能是相同的数字。所以像“100、220、343和522”这样的数字是非法的,因为它们包含的数字是相同的

我决定最好分别生成每个数字,比较每个数字并根据需要进行更改,然后将每个数字添加到字符串中。这是我的密码:

Scanner input = new Scanner(System.in);

    // Generate a random 3 digit number between 102 and 987. The bounds are 102 to 987 because each 
    // digit in the number must be different. The generated number will be called SecretNum and be
    // stored as a String.

    // The First digit is generated between 1 and 9 while the second and third digit are generated 
    // between 0 and 9.

    String SecretNum = "";
    int firstDigit = (int)(Math.random() * 9 + 1);
    int secondDigit = (int)(Math.random() * 10);
    int thirdDigit = (int)(Math.random() * 10);

    // Now the program checks to see if any of the digits share the same value and if one digit shares 
    // the same value then the number is generated repeatedly until the value is different

    // Digit tests are used to determine whether or not any of the digits share the same value.
    boolean firstDigitTest = (firstDigit == secondDigit) || (firstDigit == thirdDigit);

    boolean secondDigitTest = (secondDigit == firstDigit) || (secondDigit == thirdDigit);

    boolean thirdDigitTest = (thirdDigit == firstDigit) || (thirdDigit == secondDigit);

    if (firstDigitTest){
        do{
            firstDigit = (int)(Math.random() * 9 + 1);
        }while (firstDigitTest);

    } else if (secondDigitTest){
        do{
            secondDigit = (int)(Math.random() * 10);
        }while(secondDigitTest);

    } else if (thirdDigitTest){
        do{
            thirdDigit = (int)(Math.random() * 10);
        }while(thirdDigitTest);
    }// end if statements

    // Now the program will place each digit into their respective places
    SecretNum = firstDigit + "" + secondDigit + "" + thirdDigit;

    System.out.println(SecretNum);
(暂时忽略扫描仪;这部分不需要,但我以后需要它)

不幸的是,当我测试数字时,看看是否有相同的数字,我有时会陷入无限循环。棘手的部分是,有时它会像一个无限循环一样运行,但在我终止程序之前生成数字。所以有时候如果它在一个无限循环中,我不确定它是否真的在一个无限循环中,或者我不耐烦,但我确定这是一个无限循环问题,因为我等了大约10分钟,程序还在运行

我真的不知道为什么它会变成一个无限循环,因为如果一个数字与另一个数字匹配,那么这个数字应该不断生成,直到它变成一个不同的数字,所以我不明白它是如何变成一个无限循环的。这就是我需要帮助的地方

(哦,我如何制作字符串并不取决于我将如何保存它。一旦我修复了这个循环,我将更改它,以便将数字附加到字符串中。)

问题在于(例如)
firstDigitTest
设置为特定的布尔值,或者
true
或者
false
,并且从未更改。即使将
firstDigitTest
设置为不同的值,从而解决了检测到的
firstDigitTest
问题,也不会重新更新
firstDigitTest
以检测问题是否仍然存在。因此,如果您的每个循环都被输入,那么它将无限期地循环

我认为您最好消除布尔变量,循环
,而(firstDigit==secondDigit | | firstDigit==thirdDigit | | secondDigit==thirdDigit)
问题是(例如)
firstDigitTest
被设置为特定的布尔值,或者
true
或者
false
,而且从未改变。即使将
firstDigitTest
设置为不同的值,从而解决了检测到的
firstDigitTest
问题,也不会重新更新
firstDigitTest
以检测问题是否仍然存在。因此,如果您的每个循环都被输入,那么它将无限期地循环


我想你最好消除你的布尔变量,然后循环
,而(firstDigit==secondDigit | | firstDigit==thirdDigit | | secondDigit==thirdDigit)

@DonRoby:这个问题的另一个回答者在我的答案被否决的同时失去了1个代表点,所以我相信他就是那个否决它的人。你可以看到他/她的答案,看看他认为正确的答案是什么,以及他为什么否决我的答案。更新:现在他删除了他/她的答案,取消了我的投票,所以我想大家现在都同意了。:-)哈哈,有趣的社区。无论如何,谢谢你的回答;它工作得很好!读了你的帖子后,我觉得自己很傻,但我又是一名新生。Haha@StephonGordon:不客气!您可能有兴趣知道,实际上在某些语言中,变量可以表示表达式,每次引用它时,它的值都可能不同。(例如,在“按名称调用”语义中会发生这种情况,如果你好奇的话,可以在谷歌上搜索。)关于编程的一个真正酷的事情是有许多不同的可能抽象,不同的语言采用不同的方法——但是,正如你所发现的,抽象“不匹配”可能会导致混淆错误@唐罗比:这个问题的另一位回答者在我的答案被否决的同时失去了1个代表点,所以我相信他就是那个否决我的答案的人。你可以看到他/她的答案,看看他认为正确的答案是什么,以及他为什么否决我的答案。更新:现在他删除了他/她的答案,取消了我的投票,所以我想大家现在都同意了。:-)哈哈,有趣的社区。无论如何,谢谢你的回答;它工作得很好!读了你的帖子后,我觉得自己很傻,但我又是一名新生。Haha@StephonGordon:不客气!您可能有兴趣知道,实际上在某些语言中,变量可以表示表达式,每次引用它时,它的值都可能不同。(例如,在“按名称调用”语义中会发生这种情况,如果你好奇的话,可以在谷歌上搜索。)关于编程的一个真正酷的事情是有许多不同的可能抽象,不同的语言采用不同的方法——但是,正如你所发现的,抽象“不匹配”可能会导致混淆错误!