Простой алгоритм, который дает вам случайные числа без дубликатов, можно найти в книге Programming Pearls p. 127.
Внимание: результирующий массив содержит числа в порядке! Если вы хотите их в произвольном порядке, вы должны перетасовать массив, либо с помощью Fisher-Yates shuffle , либо с помощью списка и вызова 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;
}