在Java中有效地生成唯一的随机数

cw *_*fei 1 java random

我想从范围生成唯一的随机数0 to 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
        }
Run Code Online (Sandbox Code Playgroud)

问题是我想要生成的数字越大,花费的时间就越长,对于上述方法,需要花费的时间700ms.

但是,如果我使用Random()生成它们而没有过滤器重复数字,它只需要2ms

for(int i = 0; i<10; i++) {
  int digit = 0 + new Random().nextInt((999999 - 0) + 1); 
  System.out.println(digit);
}
Run Code Online (Sandbox Code Playgroud)

还有其他方法可以更有效的方式生成唯一的随机数吗?

Pau*_*ton 5

如果您只需要10,则无需创建1000000个数字列表并将其全部随机播放.也无需编写new Integer(i)(您可以使用i).

在Java 8中,有一个非常简短的方法:

int[] arr = ThreadLocalRandom.current().ints(0, 1000000).distinct().limit(10).toArray();
System.out.println(Arrays.toString(arr));
Run Code Online (Sandbox Code Playgroud)

如果您使用的是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));
Run Code Online (Sandbox Code Playgroud)