我是Comp Sci专业的第一年,在课堂上,我们有一个项目,我们为游戏制作名为“Bagels”的算法。我们要制作一个随机的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分钟而程序仍在运行。
我真的不确定为什么它变成一个无限循环,因为如果它发生了一个数字与另一个数字匹配那么数字应该连续生成,直到它是一个不同的数字,所以我不明白它是如何变成一个无限循环。这是我需要帮助的地方。
(哦,我如何制作字符串不是我将如何保留它。一旦我修复了这个循环,我将改变它,以便将数字附加到字符串。)
答案 0 :(得分:4)
问题在于(例如)firstDigitTest
设置为特定的布尔值,true
或false
,并且永远不会更改。即使您将firstDigit
设置为其他值,从而解决firstDigitTest
检测到的问题,也不会重新更新firstDigitTest
以检测问题是否仍然存在。所以你的每个循环,如果它完全进入,将无限循环。
我认为您也可以删除布尔变量,然后循环while(firstDigit == secondDigit || firstDigit == thirdDigit || secondDigit == thirdDigit)
。