Статьи Генератор паролей UUID MD5 Unix-время URL-encode Base64 Форматирование XML Ваш внешний IP Число прописью


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

Вернуться назад

24 января 2020

Тэги: алгоритмы 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, а также новый список на основе исходного, из которого будем удалять уже выбранные элементы. Далее просто проходим в цикле нужное количество итераций, выбирая случайный элемент аналогично первому примеру. И в конце каждой итерации удаляем из созданного нами списка уже выбранный элемент.