随机数生成器生成相同的数字
Random number generator generates the same number
我是编程初学者,目前正在学习java。作为我练习的一部分,我创建了下面的代码,这只是一个游戏,要求用户猜测计算机随机生成的数字,如果玩家猜对了,分数增加 5。
问题是我的随机数生成器每次都生成相同的数字,完全没有随机性,我想解决这个问题。而且我还想要一个更直观的方法来处理我的代码。代码如下:
public static void main(String... args){
System.out.println("\nGuessNumber is a game, in which the player is required to guess the number\n" +
"generated randomly by the computer. If the player guesses it right his score\n" +
"is increased to 5, no score is cut when losing. The number will be from 1 to 6\n" +
"inclusive.\n");
Scanner scan = new Scanner(System.in);
char input;
int randomNumber;
int playerScore =0 ;
//int roundCounter = 0;
do{ System.out.print("Press 'r' to play and 'q' to quit: ");
input = scan.next().charAt(0);
switch (input){
case 'r':
System.out.print("A random number is generated for you, guess what it is: ");
int answer = scan.nextInt();
if(answer == (randomNumber = generateRandom())){
System.out.print("Congrats! that was absolutely right guess, ");
playerScore += 5;
}else{
System.out.print("Oops!, wrong guess, right answer is "+randomNumber +", ");
}
break;
case 'q':
System.out.println("Bye Bye!");
break;
default:
System.err.print("Enter a valid input: ");
break;
}
}while(input != 'q');
System.out.println("You scored "+ playerScore);
}
private static int generateRandom(){
Random random = new Random(1);
return random.nextInt(7);
}
和示例输出:
编辑:如果您能提供更好的方法来编写这段代码,请建议我
不要指定相同的种子
和commented一样,如果你想要不同的结果,请不要将种子设置为相同的数字。相同的种子产生相同的结果。
您的代码 new Random(1)
生成一个数字生成器,生成相同的输出序列。相反,调用 the no-arg constructor。改变这个:
Random random = new Random(1);
… 对此:
Random random = new Random();
no-arg 构造函数的 Javadoc 承诺:
This constructor sets the seed of the random number generator to a value very likely to be distinct from any other invocation of this constructor.
不要重新创建生成器
此外,您正在不必要地重新创建随机生成器。不要一遍又一遍地调用 new Random
。调用一次,然后将对生成器对象的引用存储在变量上以备后用。
ThreadLocalRandom
我建议使用 ThreadLocalRandom
而不是 Random
。如果您向代码中添加线程和执行程序服务,这样做可以避免并发问题。另一个好处是 class 上提供的许多便捷方法。使用此 class 使语法非常简单,以至于您没有必要创建单独的方法。只需致电:
ThreadLocalRandom.current().nextInt( 7 )
您只需删除 Random() 构造函数中的种子编号,您的代码就可以运行了。只需更改您的 generateRandom() 方法即可。
private static int generateRandom() {
Random random = new Random();
return random.nextInt(17);
}
或者您可以在 genrateRandom() 方法中使用此技术
private static int generateRandom() {
int maximumnumber =17, minimumnuber =0;
int randomnum = (int)(Math.random()*(maximumnumber-minimumnuber+1)+minimumnuber);
return randomnum;
}
我是编程初学者,目前正在学习java。作为我练习的一部分,我创建了下面的代码,这只是一个游戏,要求用户猜测计算机随机生成的数字,如果玩家猜对了,分数增加 5。 问题是我的随机数生成器每次都生成相同的数字,完全没有随机性,我想解决这个问题。而且我还想要一个更直观的方法来处理我的代码。代码如下:
public static void main(String... args){
System.out.println("\nGuessNumber is a game, in which the player is required to guess the number\n" +
"generated randomly by the computer. If the player guesses it right his score\n" +
"is increased to 5, no score is cut when losing. The number will be from 1 to 6\n" +
"inclusive.\n");
Scanner scan = new Scanner(System.in);
char input;
int randomNumber;
int playerScore =0 ;
//int roundCounter = 0;
do{ System.out.print("Press 'r' to play and 'q' to quit: ");
input = scan.next().charAt(0);
switch (input){
case 'r':
System.out.print("A random number is generated for you, guess what it is: ");
int answer = scan.nextInt();
if(answer == (randomNumber = generateRandom())){
System.out.print("Congrats! that was absolutely right guess, ");
playerScore += 5;
}else{
System.out.print("Oops!, wrong guess, right answer is "+randomNumber +", ");
}
break;
case 'q':
System.out.println("Bye Bye!");
break;
default:
System.err.print("Enter a valid input: ");
break;
}
}while(input != 'q');
System.out.println("You scored "+ playerScore);
}
private static int generateRandom(){
Random random = new Random(1);
return random.nextInt(7);
}
和示例输出:
编辑:如果您能提供更好的方法来编写这段代码,请建议我
不要指定相同的种子
和commented一样,如果你想要不同的结果,请不要将种子设置为相同的数字。相同的种子产生相同的结果。
您的代码 new Random(1)
生成一个数字生成器,生成相同的输出序列。相反,调用 the no-arg constructor。改变这个:
Random random = new Random(1);
… 对此:
Random random = new Random();
no-arg 构造函数的 Javadoc 承诺:
This constructor sets the seed of the random number generator to a value very likely to be distinct from any other invocation of this constructor.
不要重新创建生成器
此外,您正在不必要地重新创建随机生成器。不要一遍又一遍地调用 new Random
。调用一次,然后将对生成器对象的引用存储在变量上以备后用。
ThreadLocalRandom
我建议使用 ThreadLocalRandom
而不是 Random
。如果您向代码中添加线程和执行程序服务,这样做可以避免并发问题。另一个好处是 class 上提供的许多便捷方法。使用此 class 使语法非常简单,以至于您没有必要创建单独的方法。只需致电:
ThreadLocalRandom.current().nextInt( 7 )
您只需删除 Random() 构造函数中的种子编号,您的代码就可以运行了。只需更改您的 generateRandom() 方法即可。
private static int generateRandom() {
Random random = new Random();
return random.nextInt(17);
}
或者您可以在 genrateRandom() 方法中使用此技术
private static int generateRandom() {
int maximumnumber =17, minimumnuber =0;
int randomnum = (int)(Math.random()*(maximumnumber-minimumnuber+1)+minimumnuber);
return randomnum;
}