为什么/如何将整数设置为-1使我的while循环工作?

时间:2014-12-07 17:31:38

标签: java performance loops while-loop

这是我的代码。这很简单,我只是要求用户猜测,并告诉他们这些数字是正确的,高的还是低的。为了不断询问,我做了一个循环。

虽然,我不知道为什么或如何以它的方式工作。我将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");
    }
}

}

4 个答案:

答案 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()行。