【问题标题】:probable scope issue(maybe)?可能的范围问题(也许)?
【发布时间】:2016-05-16 06:53:31
【问题描述】:

所以我正在制作一个小命令行彩票游戏(代码中的 cmets 解释了一切)但是当我生成随机数时,我的代码并没有像我希望的那样将其缩短为三位数,除了游戏可以运行并且可以玩之外每隔一段时间,随机生成的数字中就有一个超过一千,并且不会缩短。任何想法(对不起,如果它难以阅读,我还不知道很多 java 概念,所以我坚持使用基本的逻辑运算符)

/* Dustin Shropshire 5.14.2016 

test program : LotteryGame ,
generate a random number and then separate them into their place values
and store them in variables allows user to take a guess at the value
allows user to take a guess at the value and then take their input
and determine if all the numbers match in the exact order, or if they
match in any order, or if at least one of the numbers match */




import java.util.Scanner;

public class LotteryGame {
public static void main(String[] args){

    Scanner input = new Scanner(System.in);

        int  lotteryDigitNumber1 = 0, lotteryDigitNumber2 = 0, lotteryDigitNumber3 = 0; // the lottery numbers  place to hold its three digits 
        int userGuessInput = 0, userGuessDigit1 = 0, userGuessDigit2 = 0, userGuessDigit3 = 0;  // users guess and a place to hold its three digits
        int seperateLotteryNumber = 0, seperateUserNumber = 0; // used to seperate the number 
        int shortenVariable = 0; //used to shorten a randomaly generated variable if its over 1000;
        int moneyCounter = 10000; //starting amount of money
        int randomLotteryNumber = 0; //initialzing this out of the loop in the hopes that it puts everythin in scope


    while(moneyCounter > 0){

         randomLotteryNumber = (int)(Math.random() * 1000 + 100 );  // generates a random number between 0 and 1100 exlusing 1100

        System.out.println("please enter a three digit number as your guess:");

        userGuessInput = input.nextInt();

     //this while loop is used to prevent someone from entering a number less than 100 and greater than 999
    while((userGuessInput >= 1000) || (userGuessInput <= 99)){ 

        System.out.println("sorry that is not three digit number please enter a three digit number:");

        userGuessInput = input.nextInt(); } 

        System.out.println("the random lotttery number was " + " " + randomLotteryNumber);

    // this if statment is used if a randomly generated number is over 1000 to truncate to a 3 digit number
    if(randomLotteryNumber >= 1000){  

            shortenVariable = randomLotteryNumber / 10; 

        lotteryDigitNumber1 = shortenVariable / 100; 
        seperateLotteryNumber = shortenVariable % 100; 
        lotteryDigitNumber2 = seperateLotteryNumber / 10; 
        lotteryDigitNumber3 = seperateLotteryNumber % 10; 
    }

    else if( randomLotteryNumber <= 999){  

        lotteryDigitNumber1 = randomLotteryNumber / 100;
        seperateLotteryNumber = randomLotteryNumber % 100;
        lotteryDigitNumber2 = seperateLotteryNumber / 10;
        lotteryDigitNumber3 = seperateLotteryNumber % 10;}
        //used to seperate lottery numbers digits into individual variables


        userGuessDigit1 = userGuessInput / 100;
        seperateUserNumber = userGuessInput % 100;
        userGuessDigit2 = seperateUserNumber /10;
        userGuessDigit3 = seperateUserNumber % 10;
        //used to seperate lottery number digits into individual variables 


    if(userGuessInput == randomLotteryNumber ) { 

            moneyCounter = moneyCounter + 10000;

            System.out.println("the lottery number was:" + " " + randomLotteryNumber + " "  + "you guessed right you earn $10,000" 
            + " " + "currentmoney:" + " " + moneyCounter);

        //this if statment is only true when both the lottery number and the user guess is exactly matched
        } 
    else if ((userGuessDigit1 == lotteryDigitNumber1 && userGuessDigit2 == lotteryDigitNumber3 && userGuessDigit3 == lotteryDigitNumber2
            || userGuessDigit1 == lotteryDigitNumber2 && userGuessDigit2 == lotteryDigitNumber1 && userGuessDigit3 == lotteryDigitNumber3
            || userGuessDigit1 == lotteryDigitNumber2 && userGuessDigit2 == lotteryDigitNumber3 && userGuessDigit3 == lotteryDigitNumber1
            || userGuessDigit1 == lotteryDigitNumber3 && userGuessDigit2 == lotteryDigitNumber2 && userGuessDigit3 == lotteryDigitNumber1 
            || userGuessDigit1 == lotteryDigitNumber3 && userGuessDigit2 == lotteryDigitNumber1 && userGuessDigit3 == lotteryDigitNumber2)){
                //this logic block is true when the lottery number and user guess have all the same numbers but in a different order 

                moneyCounter = moneyCounter + 3000;

                System.out.println("the lottery number was:" + " " + randomLotteryNumber + " "  + "you guessed all the numbers right just in the wrong order you earn $3,000" 
                                    + " " + "currentmoney:" + " " + moneyCounter);



            }
    else if ( (userGuessDigit1 == lotteryDigitNumber1) || (userGuessDigit1 == lotteryDigitNumber2) || (userGuessDigit1 == lotteryDigitNumber3)
                || (userGuessDigit2 == lotteryDigitNumber1) || (userGuessDigit2 == lotteryDigitNumber2) || (userGuessDigit2 == lotteryDigitNumber3)
                || (userGuessDigit3 == lotteryDigitNumber1) || (userGuessDigit3 == lotteryDigitNumber2) || (userGuessDigit3 == lotteryDigitNumber3)){
                                //this logic block is only true when the user guesses one of the same numbers as the lottery number 

                                moneyCounter = moneyCounter + 1000;

                                System.out.println("the lottery number was:" + " " + randomLotteryNumber + " "  + "you guessed one number right you earn $1,000" 
                                    + " " + "currentmoney:" + " " + moneyCounter);

                            }
    else if( (userGuessDigit1 != lotteryDigitNumber1 && userGuessDigit2 != lotteryDigitNumber3 && userGuessDigit3 != lotteryDigitNumber2
            || userGuessDigit1 != lotteryDigitNumber2 && userGuessDigit2 != lotteryDigitNumber1 && userGuessDigit3 != lotteryDigitNumber3
            || userGuessDigit1 != lotteryDigitNumber2 && userGuessDigit2 != lotteryDigitNumber3 && userGuessDigit3 != lotteryDigitNumber1
            || userGuessDigit1 != lotteryDigitNumber3 && userGuessDigit2 != lotteryDigitNumber2 && userGuessDigit3 != lotteryDigitNumber1 
            || userGuessDigit1 != lotteryDigitNumber3 && userGuessDigit2 != lotteryDigitNumber1 && userGuessDigit3 != lotteryDigitNumber2)){
                             //this logic block is used if none of the numbers in any order is matched 

                            moneyCounter = moneyCounter - 1000; 

            System.out.println("oh sadly none of the numbers match you lose  $1000"  +  " "  + "current money:"  +  " " +  moneyCounter);
            }




}


    System.out.println("your out of money thanks for playing");
        }

    }

【问题讨论】:

  • 任何范围问题都容易出现compile-time 错误。它永远不会引发任何exception 或倾向于infinite-loop @pawsome
  • 你怎么知道数字没有被缩短?如果它基于打印输出,那么您是否应该打印出randomLotteryNumber?我的意思是,如果数字超过 1000,您只选择 3 位数字,但我没有看到您修改 randomLotteryNumber ,这意味着您正在打印生成的相同数字。

标签: java while-loop scope


【解决方案1】:

这不是范围问题,而是错误使用Math.random() 的问题。数学随机返回一个介于 0(含)和 1(不含)之间的值,您似乎隐含地假设它的精度不超过一位。 Math.random() 很可能会返回一个像0.913 这样的数字,它乘以1000 将是913,然后当您添加100 将变为1013,给您一个四位数的数字。生成三位数整数的正确方法是执行以下操作:

Random rand = new Random(); // should be done only once when the program starts
int randomLotteryNumber = 100 + rand.nextInt(900);

【讨论】:

  • 即使它是 4 位数字,我也有部分代码将其截断为 3 位数字,但我很好奇它不起作用
【解决方案2】:

Math.Random() 将返回一个从0.00.99... 的数字

将它乘以 1000 可能会得到像 999 这样的数字,+100 会得到四位数字。

这是一个有点复杂的解决方案

randomLotteryNumber = (randomLotteryNumber = (int)(Math.random() * 1000)) > 99 ? 
                                              randomLotteryNumber : 
                                              randomLotteryNumber + 100;

另一种简单的方法是使用 Java Streams

Random r = new Random();
randomLotteryNumber = r.ints(100, 1000).findFirst().getAsInt();

这将返回一个从 100(包括)到 1000(不包括)的随机整数。

【讨论】:

  • 感谢您的帮助我特别好奇为什么即使它是一个 4 位数字,我的代码应该将其缩短为 3 位数字也不起作用。
  • @pawsome 你正在使用%100,例如,如果我们采用1001 : 1001 % 100 = 1 所以它会给出一些数字的不需要的结果。最好的方法是像上面给出的那样立即生成它。
【解决方案3】:

我相信您的问题在于您的打印输出。您正在打印出randomLotteryNumber,而不是您从生成的号码中选择的 3 位数字。由于您从不修改该数字,因此您总是打印出您生成的数字。

您的代码中的一个示例:

System.out.println("the lottery number was:" + " " + randomLotteryNumber + " "  + "you guessed one number right you earn $1,000" 
                                    + " " + "currentmoney:" + " " + moneyCounter);

您可能应该打印(toString() 部分只是为了确保没有进行算术运算,并且可能会被其他东西替换):

System.out.println("the lottery number was:" + " " + lotteryDigitNumber1.toString()+lotteryDigitNumber2.toString()+lotteryDigitNumber3.toString()+ " "  + "you guessed one number right you earn $1,000" 
                                    + " " + "currentmoney:" + " " + moneyCounter);

【讨论】:

    【解决方案4】:

    得到一个答案,我打印了错误的值,并且如果大于一千的数字中包含 0,则会出现逻辑问题,

    import java.util.Scanner;
    
    public class LotteryGame {
    public static void main(String[] args){
    
        Scanner input = new Scanner(System.in);
    
            int  lotteryDigitNumber1 = 0, lotteryDigitNumber2 = 0, lotteryDigitNumber3 = 0; // the lottery numbers  place to hold its three digits 
            int userGuessInput = 0, userGuessDigit1 = 0, userGuessDigit2 = 0, userGuessDigit3 = 0;  // users guess and a place to hold its three digits
            int seperateLotteryNumber = 0, seperateUserNumber = 0; // used to seperate the number 
            int shortenVariable = 0; //used to shorten a randomaly generated variable if its over 1000;
            int moneyCounter = 10000; //starting amount of money
            int randomLotteryNumber = 0; //initialzing this out of the loop in the hopes that it puts everythin in scope
    
    
        while(moneyCounter > 0){
    
             randomLotteryNumber = (int)(Math.random() * 1000 + 100 );  // generates a random number between 0 and 1100 exlusing 1100
    
            System.out.println("please enter a three digit number as your guess:");
    
            userGuessInput = input.nextInt();
    
         //this while loop is used to prevent someone from entering a number less than 100 and greater than 999
        while((userGuessInput >= 1000) || (userGuessInput <= 99)){ 
    
            System.out.println("sorry that is not three digit number please enter a three digit number:");
    
            userGuessInput = input.nextInt(); } 
    
    
    
        // this if statment is used if a randomly generated number is over 1000 to truncate to a 3 digit number
        if(randomLotteryNumber >= 1000){  
    
                shortenVariable = randomLotteryNumber / 10; 
    
            lotteryDigitNumber1 = shortenVariable / 100; 
            seperateLotteryNumber = shortenVariable % 100; 
            lotteryDigitNumber2 = seperateLotteryNumber / 10; 
            lotteryDigitNumber3 = seperateLotteryNumber % 10; 
    
        //may delete this logic later
        if(lotteryDigitNumber2 == 0){
            lotteryDigitNumber3 = seperateLotteryNumber;
        }
    
    
        }
    
        else if( randomLotteryNumber <= 999){  
    
            lotteryDigitNumber1 = randomLotteryNumber / 100;
            seperateLotteryNumber = randomLotteryNumber % 100;
            lotteryDigitNumber2 = seperateLotteryNumber / 10;
            lotteryDigitNumber3 = seperateLotteryNumber % 10;
            shortenVariable = randomLotteryNumber;
            }
            //used to seperate lottery numbers digits into individual variables
    
            System.out.println("the random number is" + " " + shortenVariable);
    
            userGuessDigit1 = userGuessInput / 100;
            seperateUserNumber = userGuessInput % 100;
            userGuessDigit2 = seperateUserNumber /10;
            userGuessDigit3 = seperateUserNumber % 10;
            //used to seperate lottery number digits into individual variables 
    
    
        if(userGuessInput == shortenVariable ) { 
    
                moneyCounter = moneyCounter + 10000;
    
                System.out.println("the lottery number was:" + " " + shortenVariable + " "  + "you guessed right you earn $10,000" 
                + " " + "currentmoney:" + " " + moneyCounter);
    
            //this if statment is only true when both the lottery number and the user guess is exactly matched
            } 
        else if ((userGuessDigit1 == lotteryDigitNumber1 && userGuessDigit2 == lotteryDigitNumber3 && userGuessDigit3 == lotteryDigitNumber2
                || userGuessDigit1 == lotteryDigitNumber2 && userGuessDigit2 == lotteryDigitNumber1 && userGuessDigit3 == lotteryDigitNumber3
                || userGuessDigit1 == lotteryDigitNumber2 && userGuessDigit2 == lotteryDigitNumber3 && userGuessDigit3 == lotteryDigitNumber1
                || userGuessDigit1 == lotteryDigitNumber3 && userGuessDigit2 == lotteryDigitNumber2 && userGuessDigit3 == lotteryDigitNumber1 
                || userGuessDigit1 == lotteryDigitNumber3 && userGuessDigit2 == lotteryDigitNumber1 && userGuessDigit3 == lotteryDigitNumber2)){
                    //this logic block is true when the lottery number and user guess have all the same numbers but in a different order 
    
                    moneyCounter = moneyCounter + 3000;
    
                    System.out.println("the lottery number was:" + " " + shortenVariable + " "  + "you guessed all the numbers right just in the wrong order you earn $3,000" 
                                        + " " + "currentmoney:" + " " + moneyCounter);
    
    
    
                }
        else if ( (userGuessDigit1 == lotteryDigitNumber1) || (userGuessDigit1 == lotteryDigitNumber2) || (userGuessDigit1 == lotteryDigitNumber3)
                    || (userGuessDigit2 == lotteryDigitNumber1) || (userGuessDigit2 == lotteryDigitNumber2) || (userGuessDigit2 == lotteryDigitNumber3)
                    || (userGuessDigit3 == lotteryDigitNumber1) || (userGuessDigit3 == lotteryDigitNumber2) || (userGuessDigit3 == lotteryDigitNumber3)){
                                    //this logic block is only true when the user guesses one of the same numbers as the lottery number 
    
                                    moneyCounter = moneyCounter + 1000;
    
                                    System.out.println("the lottery number was:" + " " + shortenVariable + " "  + "you dident guess all the numbers but got some right you earn $1,000" 
                                        + " " + "currentmoney:" + " " + moneyCounter);
    
                                }
        else if( (userGuessDigit1 != lotteryDigitNumber1 && userGuessDigit2 != lotteryDigitNumber3 && userGuessDigit3 != lotteryDigitNumber2
                || userGuessDigit1 != lotteryDigitNumber2 && userGuessDigit2 != lotteryDigitNumber1 && userGuessDigit3 != lotteryDigitNumber3
                || userGuessDigit1 != lotteryDigitNumber2 && userGuessDigit2 != lotteryDigitNumber3 && userGuessDigit3 != lotteryDigitNumber1
                || userGuessDigit1 != lotteryDigitNumber3 && userGuessDigit2 != lotteryDigitNumber2 && userGuessDigit3 != lotteryDigitNumber1 
                || userGuessDigit1 != lotteryDigitNumber3 && userGuessDigit2 != lotteryDigitNumber1 && userGuessDigit3 != lotteryDigitNumber2)){
                                 //this logic block is used if none of the numbers in any order is matched 
    
                                moneyCounter = moneyCounter - 1000; 
    
                System.out.println("oh sadly none of the numbers match you lose  $1000"  +  " "  + "current money:"  +  " " +  moneyCounter);
                }
    
    
    
    
    }
    
    
        System.out.println("your out of money thanks for playing");
            }
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-27
      • 2016-12-05
      • 1970-01-01
      • 2016-03-09
      • 2021-12-11
      • 2022-07-18
      • 2012-04-05
      • 1970-01-01
      相关资源
      最近更新 更多