Java - 生成一组没有重复的随机数

时间:2015-11-27 15:39:11

标签: java random while-loop

使用以下代码,我试图在1到50之间生成10个随机数,而不打印任何重复数据。

我当前的代码在RandomNum.java文件中:

public class RandomNum
{
    public static void main(String[] args) 
    {
             int counter = 0;
             int num = 0;
             while(counter<=10)
             {
                    num=(int)(1+Math.random()*(50));
                    System.out.println("The number"+" "+num+" "+"was drawn.");
                    ++counter;
            }
    }
}

此代码成功生成并打印出数字的值,但我想这样做,以便程序打印出1到50之间的10个唯一数字,而不是包含任何重复数。

我将如何做到这一点?

谢谢!

1 个答案:

答案 0 :(得分:1)

你可以使用shuffle。

List<Integer> ints = IntStream.range(1, 50).boxed().collect(toList());
Collections.shuffle(ints);
List<Integer> ten = ints.subList(0, 10);

或者您可以使用LinkedHashSet。注意:如果您使用HashSet,则订单可能不是非常随机。例如如果以任何顺序向HashSet添加0到10,它将按顺序排列。

Set<Integer> ints = new LinkedHashSet<>();
Random rand = new Random();
while(ints.size() < 10)
    ints.add(rand.nextInt(50) + 1);
// copy to a list to taste.

或者您可以使用地图。

List<Integer> collect = IntStream.range(1, 50).boxed()
        .collect(groupingBy(i -> Math.random()))
        .values().stream().flatMap(Collection::stream)
        .limit(10).collect(toList());

或者您可以使用Random.ints

List<Integer> collect = new Random().ints(1, 50)
        .boxed()
        .collect(Collectors.toCollection(LinkedHashSet::new)) // distinct
        .stream().limit(10)
        .collect(Collectors.toList());

注意:在之前的回答.distinct()中,使用了用于执行唯一性的集合的选择实际上没有在Java 8中使用HashSet,如前所述,这是一个糟糕的选择。 / p>