这是我的代码。这很简单,我只是要求用户猜测,并告诉他们这些数字是正确的,高的还是低的。为了不断询问,我做了一个循环。
虽然,我不知道为什么或如何以它的方式工作。我将int初始化为-1为猜测,它似乎工作。为什么在没有初始化它的情况下不会这样做,以及为什么一个负数开始。这样做似乎有点不合适。我猜这不是常见做法吗?
再次感谢! :)
import java.util.Scanner;
public class numGuess
{
public static void main(String[] args)
{
//generate random number between 1 and 100
int number = (int)(Math.random() * 101);
Scanner input = new Scanner(System.in);
System.out.println("Guess a number between 1 and 100");
int guess = -1;
while (guess != number)
{
System.out.print("\nEnter your guess: ");
guess = input.nextInt();
if (guess == number)
System.out.println("you are correct, the number is " + number);
else if (guess > number)
System.out.println("your guess is too high");
else
System.out.println("your guess is too low");
}
}
}
答案 0 :(得分:2)
Java是一种强类型语言,因此需要在可以使用之前定义变量。
您必须先定义guess
才能使用它。只要guess
最初被定义为非数字的任何东西,循环就会起作用。
您可以像这样定义guess
以确保其不同。你永远不会想要这样做。我只想表明几乎任何初始值都可用于初始化guess
。
int guess = number - 1;
你也可以使用do..while循环来最初分配它。这是首选的方法,因为你没有做任何假设。
int guess;
do {
System.out.print("\nEnter your guess: ");
guess = input.nextInt();
if (guess == number)
System.out.println("you are correct, the number is " + number);
else if (guess > number)
System.out.println("your guess is too high");
else
System.out.println("your guess is too low");
}while(guess != number);
循环运行一次并直接从用户输入分配guess
,而不必在自己之前分配它。
答案 1 :(得分:1)
在您的情况下,将-1作为猜测值没有硬性规定。您甚至可以将其初始化为大于101的值或除0到101之间的任何数字。
或者,如果您不想初始化它,可以使用do while循环:
int guess;
do {
System.out.print("\nEnter your guess: ");
guess = input.nextInt();
if (guess == number)
System.out.println("you are correct, the number is " + number);
else if (guess > number)
System.out.println("your guess is too high");
else
System.out.println("your guess is too low");
} while (guess != number);
答案 2 :(得分:0)
-1是 sentinel 值。也就是说,它对于您的程序的目的来说是无效的值,特别是它不是(int) (Math.random() * 101)
返回的任何值的值(BTW,它之间生成一个数字) 0和100,而不是1和100)。
避免"双重职责的一种方法" guess
的更改是将循环更改为无条件循环,然后如果猜测正确则使用break
突破循环。像这样:
while (true) {
System.out.print("\nEnter your guess: ");
int guess = input.nextInt();
if (guess == number) {
System.out.println("you are correct, the number is " + number);
break;
} else if (guess > number) {
System.out.println("your guess is too high");
} else {
System.out.println("your guess is too low");
}
}
(请注意,我已在您的if
块中添加了大括号,以便分支中可以有多个语句。)这可能是最干净的方法。
答案 3 :(得分:0)
您使用-1作为标记(sentinel)值。它是一个不允许用户猜测的值,因此它表示尚未发生猜测。如果你根本没有对它进行初始化,那么它将从零开始,标志值将为零,用户不应该被允许猜测为零,随机数应该永远不为零。
换句话说,您应该可以使用零作为标志值。但是,你的Math.random()似乎并不排除零。请查看 Math.random() explained 。
//generate random number between 1 and 100
int number = (int)(Math.random() * 101);
应该是
int number = (int)(Math.random() * 100) + 1;
Math.random()
的范围为[0,1)。这意味着包含0但不包含1。您现有的代码将从0到100中选择数字。您告诉用户您将从1到100中选择。除非您打算作弊,需要修复。
它也是一个需要测试的噩梦,因为它只有1%的时间才会发生。请仔细阅读Math.random()
的文档。
如果您编写一个运行测试,直到value
已经存在,那么每个数字都应该可以存在,只有当您没有错误时它才会停止。事实就是如此,如果你已经正确编程并且让它循环459次,那么它只有1%的可能性,它只是偶然地没有选择0。所以你不应该等到很久才进行测试。如果你关心,我可以告诉你背后的数学。
此外,您可能希望考虑do-while
循环,这样您就不会首先需要旗帜。但是,您是否需要修复Math.random()
行。