Хотя это старый поток, но добавление другого варианта может не повредить. (Лямбда-функции JDK 1.8, кажется, упрощают эту задачу);
Проблема может быть разбита на следующие шаги;
- Получите минимальное значение для предоставленного списка целых чисел (для которого нужно генерировать уникальные случайные числа)
- Получить максимальное значение для предоставленного списка целых чисел
- Используйте класс ThreadLocalRandom (из JDK 1.8) для генерации случайных целочисленных значений против ранее найденных минимальных и максимальных целочисленных значений, а затем выполните фильтрацию, чтобы гарантировать, что значения действительно содержатся в первоначально предоставленном списке. Наконец, примените отличное к intstream, чтобы убедиться, что сгенерированные числа уникальны.
Вот функция с некоторым описанием:
private List<Integer> getUniqueRandomInts(List<Integer> idList, Integer numberToGenerate) {
List<Integer> generatedUniqueIds = new ArrayList<>();
Integer minId = idList.stream().mapToInt (v->v).min().orElseThrow(NoSuchElementException::new);
Integer maxId = idList.stream().mapToInt (v->v).max().orElseThrow(NoSuchElementException::new);
ThreadLocalRandom.current().ints(minId,maxId)
.filter(e->idList.contains(e))
.distinct()
.limit(numberToGenerate)
.forEach(generatedUniqueIds:: add);
return generatedUniqueIds;
}
Итак, чтобы получить 11 уникальных случайных чисел для объекта списка allIntegers, мы вызовем функцию вида:
List<Integer> ids = getUniqueRandomInts(allIntegers,11);
Функция объявляет новый список arrayList «generatedUniqueIds» и заполняет его каждым уникальным случайным целым числом до требуемого числа перед возвратом.
Класс PS ThreadLocalRandom избегает общего начального значения в случае параллельных потоков.
1..100
(для этого есть известные алгоритмы), но остановитесь после определения первыхn
элементов.