我想生成 0 到 999,999
范围内的唯一随机数。
为了实现这一目标,我尝试了:
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 999999; i++) {
list.add(new Integer(i)); // Add numbers from 0 - 999,999 into ArrayList
}
Collections.shuffle(list); // shuffle them
for (int i = 0; i < 10; i++) {
System.out.println(list.get(i)); // printed unique numbers
}
问题是我要生成的数字越大,耗时越长,对于上面的方法,大概耗时700ms
。
但如果我使用 Random()
生成它们而不过滤重复数字,它只需要 2ms
for(int i = 0; i<10; i++) {
int digit = 0 + new Random().nextInt((999999 - 0) + 1);
System.out.println(digit);
}
有没有其他方法可以更有效地生成唯一的随机数?
最佳答案
如果您只需要 10 个,则无需创建 1000000 个数字的列表并将它们全部打乱。也无需编写 new Integer(i)
(您可以只使用 我
).
在 Java 8 中,有一种非常简单的方法可以做到这一点:
int[] arr = ThreadLocalRandom.current().ints(0, 1000000).distinct().limit(10).toArray();
System.out.println(Arrays.toString(arr));
如果您使用的是 Java 7 或更低版本,您可以这样做:
Random rand = new Random(); // Only do this in Java 6 or below. Now you should use ThreadLocalRandom.current().
int[] arr = new int[10];
Set<Integer> set = new HashSet<Integer>();
for (int index = 0, a; index < 10;)
if (set.add(a = rand.nextInt(1000000)))
arr[index++] = a;
System.out.println(Arrays.toString(arr));
关于java - 在 Java 中有效地生成唯一的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33908199/