Выберите n уникальных случайных чисел от 0 до m-1.
int[] uniqueRand(int n, int m){
Random rand = new Random();
int[] r = new int[n];
int[] result = new int[n];
for(int i = 0; i < n; i++){
r[i] = rand.nextInt(m-i);
result[i] = r[i];
for(int j = i-1; j >= 0; j--){
if(result[i] >= r[j])
result[i]++;
}
}
return result;
}
Представьте список, содержащий числа от 0 до m-1.Чтобы выбрать первый номер, мы просто используем rand.nextInt(m)
.Затем удалите номер из списка.Теперь осталось число m-1, поэтому мы звоним rand.nextInt(m-1)
.Число, которое мы получаем, представляет позицию в списке.Если оно меньше первого числа, то это второе число, так как часть списка до первого номера не была изменена при удалении первого числа.Если позиция больше или равна первому числу, второе число - это позиция + 1.Проделав дальнейший вывод, вы можете получить этот алгоритм.
Объяснение
Этот алгоритм имеет O (n ^ 2) сложность.Так что это хорошо для генерации небольшого количества уникальных чисел из большого набора.В то время как алгоритму тасования требуется по крайней мере O (m) для выполнения тасования.
Алгоритму на основе тасования также требуется память для хранения всех возможных результатов выполнения тасования, этот алгоритм не нужен.