Java生成非重复随机数

Fer*_*nez 30 java random duplicates

我想在Java中创建一组没有重复的随机数.

例如,我有一个数组来存储从0到9999的10,000个随机整数.

这是我到目前为止:

import java.util.Random;
public class Sort{

    public static void main(String[] args){

        int[] nums = new int[10000];

        Random randomGenerator = new Random();

        for (int i = 0; i < nums.length; ++i){
            nums[i] = randomGenerator.nextInt(10000);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但上面的代码会产生重​​复.如何确保随机数不重复?

Ach*_*Jha 42

Integer[] arr = {...};
Collections.shuffle(Arrays.asList(arr));
Run Code Online (Sandbox Code Playgroud)

例如:

public static void main(String[] args) {
    Integer[] arr = new Integer[1000];
    for (int i = 0; i < arr.length; i++) {
        arr[i] = i;
    }
    Collections.shuffle(Arrays.asList(arr));
    System.out.println(Arrays.toString(arr));

}
Run Code Online (Sandbox Code Playgroud)

  • 随机播放很棒,但首先您应该创建包含 0 到 9999 之间数字的数组,然后对其进行随机播放。另外,shuffle的时间复杂度是多少? (2认同)

the*_*the 7

可以在Programming Pearls p.中找到一个简单的算法,它可以为您提供无重复的随机数.127.

注意:结果数组按顺序包含数字!如果你想以随机顺序使用它们,你必须使用Fisher-Yates shuffle或使用List和call 来对数组进行混洗Collections.shuffle().

此算法的好处是您不需要创建具有所有可能数字的数组,并且运行时复杂性仍然是线性的O(n).

public static int[] sampleRandomNumbersWithoutRepetition(int start, int end, int count) {
    Random rng = new Random();

    int[] result = new int[count];
    int cur = 0;
    int remaining = end - start;
    for (int i = start; i < end && count > 0; i++) {
        double probability = rng.nextDouble();
        if (probability < ((double) count) / (double) remaining) {
            count--;
            result[cur++] = i;
        }
        remaining--;
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)


Sla*_*ala 5

在 Java 8 中,如果你想在 中拥有一个list非重复的N随机整数range (a, b),其中b是独占的,你可以使用这样的东西:

Random random = new Random();
List<Integer> randomNumbers = random.ints(a, b).distinct().limit(N).boxed().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

  • @Torben 实际上,在 Vaibhav Jain 实现中,在每次迭代中找到正确随机数的概率由 (N-n+1)/N 给出。其中*N* 是请求的随机数总数,*n* 是当前迭代的次数。预期的迭代次数由`O(N log(N))`给出,平均小于500500。见https://en.wikipedia.org/wiki/Coupon_collector%27s_problem (2认同)