打印生成的 20 个随机数列表 + 打印不同的列表 w/ 来自第一个列表的相同#s w/o 重复#s

Print generated list of 20 random numbers + print different list w/ same #s from first list w/o duplicate #s

我正在尝试编写一个程序,生成 20 个 1 到 20 之间的随机整数,然后将随机数列表打印到屏幕上。在那之后,我想用第一个列表中的相同数字打印一个不同的列表来屏幕,只跳过任何已经打印到屏幕上的数字。目前,我的代码生成从 1 到 20 的 20 个数字。我不知道如何只打印没有重复数字的不同列表。感谢所有提前帮助我的人!

public void randomNumbers(){
    System.out.println("Twenty random integers: ");
    for (int x = 0; x < 20; x++){
        int max = 20; //max value for range
        int min = 1; //min value for range
        Random rand = new Random();
        int randomNum = rand.nextInt((max - min) + 1) + min;//generates random # within range
        System.out.println(randomNum);
    }
System.out.println("Twenty random integers w/o duplicates: ");
}

这是一种有趣的方法,可以一次性完成 Java 8 个流:

Random rand = new Random();
IntStream.generate(rand::nextInt).limit(20).map(n -> n % 20 + 1)
    .peek(System.out::println)
    .collect(Collectors.toSet()).forEach(System.out::println);

如果你不习惯流,那么我将其翻译如下:

  • 生成=给我源源不断的随机数
  • limit =其实只给我前20个
  • map = 将数字转换为 1 到 20 之间
  • peek = 打印出来
  • 收集 = 将它们放在一个集合中
  • forEach = 打印出集合中的每一项

如果您需要在没有流的情况下解决这个问题,那么一个简单的机制是在打印数字时将数字添加到集合中:

Random rand = new Random();
Set<Integer> randSet = new TreeSet<>();
for (int x = 0; x < 20; x++){
    int randomNum = rand.nextInt(20) + 1;
    randSet.add(randomNum);
    System.out.println(randomNum);
}
for (Integer randomNum: randSet) {
    System.out.println(randomNum);
}