一种有效的算法,可对小于一个大最大值(例如100_000)的4个唯一整数进行随机处理

Loc*_*Loc 1 java random algorithm

这是我的尝试:

public static void main(String[] args) {
    // Max 100_000
    System.out.println(Arrays.toString(randomFour(100_000)));
}

public static int[] randomFour(int max) {
    Random r = new Random();
    int[] four = new int[4];

    for (int i = 0; i < 4; i++) {

        while (true) {
            // Random from 1 to max
            four[i] = 1 + (int) (r.nextFloat() * max);

            boolean dup = false; // check j: 0 -> i-1
            for (int j = 0; j < i; j++) {
                if (four[j] == four[i]) {
                    dup = true;
                    break;
                }
            }
            if (dup == false) {
                break;
            }
        }
    }
    return four;
}
Run Code Online (Sandbox Code Playgroud)

此实现工作正常。是否有更好的算法来解决此问题(既耗时又耗费内存),尤其是对于很大的最大值?谢谢!

JB *_*zet 6

如果我理解正确,则希望有一个由4个不同的随机整数组成的数组,该数组在1到100_000(含)之间。

这是一种简洁的最终表达方式

int[] four = ThreadLocalRandom.current()
                     .ints(1, 100_001) // 1 is inclusive, 100_001 is exclusive
                     .distinct()
                     .limit(4)
                     .toArray();
Run Code Online (Sandbox Code Playgroud)