Перейти к основному содержимому

Java — получить случайный элемент/элемент из списка

· 3 мин. чтения

1. Введение

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

2. Выбор случайного предмета/предметов

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

Ключевым моментом здесь является то, что вы не должны использовать индекс, превышающий размер вашего списка .

2.1. Один случайный предмет

Чтобы выбрать случайный индекс, вы можете использовать метод Random.nextInt(intbound) :

public void givenList_shouldReturnARandomElement() {
List<Integer> givenList = Arrays.asList(1, 2, 3);
Random rand = new Random();
int randomElement = givenList.get(rand.nextInt(givenList.size()));
}

Вместо класса Random вы всегда можете использовать статический метод Math.random() и умножить его на размер списка ( Math.random() генерирует двойное случайное значение между 0 (включительно) и 1 (исключительно), поэтому не забудьте привести его к типу int после умножения).

2.2. Выберите случайный индекс в многопоточной среде

При написании многопоточных приложений с использованием одного экземпляра класса Random может быть выбрано одно и то же значение для каждого процесса, обращающегося к этому экземпляру. Мы всегда можем создать новый экземпляр для каждого потока, используя выделенный класс ThreadLocalRandom :

int randomElementIndex
= ThreadLocalRandom.current().nextInt(listSize) % givenList.size();

2.3. Выберите случайные элементы с повторениями

Иногда вам может понадобиться выбрать несколько элементов из списка. Это довольно просто:

public void givenList_whenNumberElementsChosen_shouldReturnRandomElementsRepeat() {
Random rand = new Random();
List<String> givenList = Arrays.asList("one", "two", "three", "four");

int numberOfElements = 2;

for (int i = 0; i < numberOfElements; i++) {
int randomIndex = rand.nextInt(givenList.size());
String randomElement = givenList.get(randomIndex);
}
}

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

Здесь вам нужно убедиться, что элемент удаляется из списка после выбора:

public void givenList_whenNumberElementsChosen_shouldReturnRandomElementsNoRepeat() {
Random rand = new Random();
List<String> givenList = Lists.newArrayList("one", "two", "three", "four");

int numberOfElements = 2;

for (int i = 0; i < numberOfElements; i++) {
int randomIndex = rand.nextInt(givenList.size());
String randomElement = givenList.get(randomIndex);
givenList.remove(randomIndex);
}
}

2.5. Выберите случайную серию

Если вы хотите получить случайную серию элементов, вам может пригодиться класс Collections utils:

public void givenList_whenSeriesLengthChosen_shouldReturnRandomSeries() {
List<Integer> givenList = Lists.newArrayList(1, 2, 3, 4, 5, 6);
Collections.shuffle(givenList);

int randomSeriesLength = 3;

List<Integer> randomSeries = givenList.subList(0, randomSeriesLength);
}

3. Заключение

В этой статье мы рассмотрели наиболее эффективный способ выборки случайных элементов из экземпляра List для различных сценариев .

Примеры кода можно найти на GitHub .