繁体   English   中英

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

[英]Why/How does setting the integer to -1 make my while loop work?

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

虽然,我不确定其原因或工作方式。 我将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");
    }
}

}

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为猜测值。 您甚至可以将其初始化为大于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);

-1是前哨值。 也就是说,对于您的程序而言,这是一个无效值,尤其是它不是(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块中添加了花括号,以便分支中可以有多个语句。)这可能是最干净的方法。

您正在使用-1作为标志( sentinel )值。 这是不允许用户猜测的值,因此它指示尚未发生猜测。 如果您根本不初始化它,那么它将从零开始,标志值将为零,不应允许用户猜测零,并且随机数永远不能为零。

换句话说,您应该能够使用零作为标志值。 但是,您是Math.random()似乎并不排除零。 看看Math.random()解释了

//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一个do-while循环,因此您一开始就不需要标志。 但是,无论是否需要,都需要修复Math.random()行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM