随机数生成器生成相同的数字

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;
}