使用以下代码,我试图在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个唯一数字,而不是包含任何重复数。
我将如何做到这一点?
谢谢!
答案 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>