Статьи
YouTube-канал

Выбор случайных элементов из списка

23 января 2020

Тэги: Java Java 10 алгоритмы

При разработке приложений иногда бывает необходимо выбрать случайный элемент из некоторого множества. Предположим, что у нас есть список фруктов и нам нужно выбрать случайным образом один из них.

var random = new SecureRandom();
var list = Arrays.asList("апельсин", "лимон", "грейпфрут");
var randomElement = list.get(random.nextInt(list.size()));
System.out.println(randomElement);

Сначала создадим генератор случайных значений SecureRandom. Можно также использовать и обычный Random, но первый выдаёт более случайные значения.

Затем мы воспользуемся методом random.nextInt(). Он возвращает целые числа в диапазоне от 0 (включительно) до указанной верхней границы. При этом само значение верхней границы исключается. В нашем примере мы передаём в этот метод количество элементов в списке (3), и он может вернуть одно из следующих значений: 0, 1 или 2. Сам элемент мы получим просто обратившись к списку по сгенерированному случайному индексу.

Но что если нам нужно получить несколько случайных элементов и при этом элементы не должны повторяться?

private void showUniqueRandomElements(Set<String> source, int elementCount) {
    var random = new SecureRandom();
    var list = new ArrayList<>(source);
    for (int i = 0; i < elementCount; i++) {
        int randomIndex = random.nextInt(list.size());
        var randomElement = list.get(randomIndex);
        System.out.println(randomElement);
        list.remove(randomIndex);
    }
}

Данный метод на вход принимает набор Set всех возможных вариантов (т.е. там гарантированно нет дублирующихся строк) и кол-во элементов, которое нужно из него выбрать случайным образом.

Опять-таки создаём объект SecureRandom, а также новый список на основе исходного, из которого будем удалять уже выбранные элементы. Далее просто проходим в цикле нужное количество итераций, выбирая случайный элемент аналогично первому примеру. И в конце каждой итерации удаляем из созданного нами списка уже выбранный элемент.


Облако тэгов

Kotlin, Java, Java 16, Java 11, Java 10, Java 9, Java 8, Spring, Spring Boot, Spring Data, SQL, PostgreSQL, Oracle, Hibernate, Collections, Stream API, многопоточность, ввод-вывод, Apache, maven, gradle, JUnit, YouTube, новости, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml

Последние статьи


Комментарии

Добавить комментарий

×

devmark.ru