Java 可能的范围问题(可能)?
因此,我正在制作一个小小的命令行彩票游戏(代码中的注释解释一切),但是当我生成随机数时,我的代码并没有像我希望的那样将其缩短为三位数,除了游戏可以运行并且可以玩之外,偶尔随机生成的数字中有一个超过1000,并且没有缩短。任何想法(抱歉,如果很难阅读,我还不知道很多java概念,所以我只能使用基本的逻辑运算符)Java 可能的范围问题(可能)?,java,while-loop,scope,java-8,Java,While Loop,Scope,Java 8,因此,我正在制作一个小小的命令行彩票游戏(代码中的注释解释一切),但是当我生成随机数时,我的代码并没有像我希望的那样将其缩短为三位数,除了游戏可以运行并且可以玩之外,偶尔随机生成的数字中有一个超过1000,并且没有缩短。任何想法(抱歉,如果很难阅读,我还不知道很多java概念,所以我只能使用基本的逻辑运算符) /*达斯汀什罗普郡5.14.2016 测试程序:彩票游戏, 生成一个随机数,然后将其分隔为位置值 并将它们存储在变量中,允许用户猜测值 允许用户猜测值,然后进行输入 并确定是否所有数字都按
/*达斯汀什罗普郡5.14.2016
测试程序:彩票游戏,
生成一个随机数,然后将其分隔为位置值
并将它们存储在变量中,允许用户猜测值
允许用户猜测值,然后进行输入
并确定是否所有数字都按精确顺序匹配,或者
按任意顺序匹配,或者至少有一个数字匹配*/
导入java.util.Scanner;
公共类彩票游戏{
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(System.in);
int lotteryDigitNumber1=0,lotteryDigitNumber2=0,lotteryDigitNumber3=0;//彩票号码放置在保留其三位数字的位置
int usergustinginput=0,usergustingdigit1=0,usergustingdigit2=0,usergustingdigit3=0;//用户猜测并放置其三位数字的位置
int separateLotteryNumber=0,separateUserNumber=0;//用于分隔数字
int shortenVariable=0;//用于在随机生成的变量超过1000时缩短该变量;
int moneyCounter=10000;//起始金额
int randomLotteryNumber=0;//在循环外初始化它,希望它将所有内容都放在范围内
while(moneyCounter>0){
randomLotteryNumber=(int)(Math.random()*1000+100);//生成0到1100之间的随机数,不包括1100
System.out.println(“请输入一个三位数作为您的猜测:”);
userGuessInput=input.nextInt();
//此while循环用于防止某人输入小于100且大于999的数字
而((userGuessInput>=1000)| |(userGuessInput=1000){
shortenVariable=randomLotteryNumber/10;
lotteryDigitNumber1=短变量/100;
SeparateLotteryNumber=短变量%100;
lotteryDigitNumber2=单独的LotteryNumber/10;
lotteryDigitNumber3=单独的LotteryNumber%10;
}
否则,如果(randomLotteryNumber这不是范围问题,这是一个错误使用Math.random()
的问题。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);
这不是范围问题,而是错误地使用Math.random()
的问题。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);
Math.Random()
将返回一个从0.0
到0.99…
将其与1000相乘可能会得到一个类似999的数字,+100给出一个四位数的数字
这里有一个稍微复杂的解决方案
randomLotteryNumber = (randomLotteryNumber = (int)(Math.random() * 1000)) > 99 ?
randomLotteryNumber :
randomLotteryNumber + 100;
另一种简单的方法是使用Java流
Random r = new Random();
randomLotteryNumber = r.ints(100, 1000).findFirst().getAsInt();
这将返回一个从100(含)到1000(不含)的随机整数。Math.random()
将返回一个从0.0
到0.99…
将其与1000相乘可能会得到一个类似999的数字,+100给出一个四位数的数字
这里有一个稍微复杂的解决方案
randomLotteryNumber = (randomLotteryNumber = (int)(Math.random() * 1000)) > 99 ?
randomLotteryNumber :
randomLotteryNumber + 100;
另一种简单的方法是使用Java流
Random r = new Random();
randomLotteryNumber = r.ints(100, 1000).findFirst().getAsInt();
这将返回一个从100(含)到1000(不含)的随机整数。我相信您的问题在于您的打印输出。您打印的是randomLotteryNumber
,而不是从生成的数字中选择的3位数字。由于您从未修改该数字,因此始终打印您生成的数字
代码中的一个示例:
System.out.println("the lottery number was:" + " " + randomLotteryNumber + " " + "you guessed one number right you earn $1,000"
+ " " + "currentmoney:" + " " + moneyCounter);
您可能应该打印(toString()
部分仅用于确保没有进行算术运算,并且可能会被其他内容替换):
我相信您的问题在于打印输出。您打印的是randomLotteryNumber
,而不是从生成的数字中选择的3位数字。由于您从不修改该数字,因此您总是打印生成的数字
代码中的一个示例:
System.out.println("the lottery number was:" + " " + randomLotteryNumber + " " + "you guessed one number right you earn $1,000"
+ " " + "currentmoney:" + " " + moneyCounter);
您可能应该打印(toString()
部分仅用于确保没有进行算术运算,并且可能会被其他内容替换):
得到一个答案,我打印了错误的值,还有一个逻辑问题,如果一个大于1000的数字中有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");
}
}
import java.util.Scanner;
公共类彩票游戏{
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(System.in);
int lotteryDigitNumber1=0,lotteryDigitNumber2=0,lotteryDigitNumber3=0;//彩票号码放置在保留其三位数字的位置
int usergustinginput=0,usergustingdigit1=0,usergustingdigit2=0,usergustingdigit3=0;//用户猜测并放置其三位数字的位置
int separateLotteryNumber=0,separateU