Статьи
Утилиты Telegram YouTube Отзывы

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

23 января 2020

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

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

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, Spring, Spring Boot, Spring Data, SQL, PostgreSQL, Oracle, Linux, Hibernate, Collections, Stream API, многопоточность, файлы, Nginx, Apache, maven, gradle, JUnit, YouTube, новости, руководство, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml.

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


Комментарии

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

×

devmark.ru