Хоча це стара тема, але додавання іншого варіанту може не зашкодити. (Здається, лямбда-функції JDK 1.8 полегшують це);
Проблему можна розбити на наступні кроки;
- Отримайте мінімальне значення для наданого списку цілих чисел (для яких потрібно генерувати унікальні випадкові числа)
- Отримайте максимальне значення для наданого списку цілих чисел
- Використовуйте клас ThreadLocalRandom (з JDK 1.8), щоб генерувати випадкові цілі значення відносно раніше знайдених мінімальних і максимальних цілих значень, а потім фільтрувати, щоб переконатися, що значення справді містяться у спочатку наданому списку. Нарешті, застосуйте відмінне значення до внутрішнього потоку, щоб переконатися, що згенеровані числа є унікальними.
Ось функція з деяким описом:
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елементи.