Случайные диапазоны и перемешивание
Ограниченные случайные значения и перемешивание коллекций
«Случайные диапазоны и перемешивание» — бесплатный урок Java Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Диапазоны и перемешивание
В реальных программах редко нужен диапазон от 0 до bound-1. В этом уроке рассматриваются произвольные диапазоны, случайное перемешивание коллекций и выбор случайных элементов.
Формула произвольного диапазона
Чтобы получить int от min до max включительно, используйте min + rng.nextInt(max - min + 1).
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random rng = new Random();
int min = 10, max = 20;
int value = min + rng.nextInt(max - min + 1);
System.out.println("10 to 20: " + value);
}
}nextInt с началом и границей
Современная Java позволяет напрямую вызвать nextInt(origin, bound): начало включается, граница не включается. Это избавляет от необходимости использовать формулу вручную.
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random rng = new Random();
int value = rng.nextInt(10, 21);
System.out.println("10 to 20: " + value);
}
}Случайные числа двойной точности в диапазоне
Чтобы получить число двойной точности от lo до hi, используйте lo + rng.nextDouble() * (hi - lo).
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random rng = new Random();
double lo = 5.0, hi = 7.5;
double value = lo + rng.nextDouble() * (hi - lo);
System.out.println(value);
}
}Перемешивание списка
Collections.shuffle(list) случайным образом меняет порядок элементов List непосредственно в списке. Это отлично подходит для колод карт и случайных викторин.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> deck = new ArrayList<>(List.of(1, 2, 3, 4, 5));
Collections.shuffle(deck);
System.out.println(deck);
}
}Воспроизводимое перемешивание
Передайте объект Random с заданным начальным значением вторым аргументом, чтобы получить детерминированное перемешивание: Collections.shuffle(list, new Random(seed)).
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class Main {
public static void main(String[] args) {
List<Integer> deck = new ArrayList<>(List.of(1, 2, 3, 4, 5));
Collections.shuffle(deck, new Random(99));
System.out.println(deck);
}
}Для перемешивания нужен изменяемый список
List.of(...) создаёт неизменяемый список. Перемешивание такого списка вызывает UnsupportedOperationException. Сначала оберните его в new ArrayList<>(...).
Выбор случайного элемента
Выберите случайный элемент, сгенерировав случайный индекс и используя get.
import java.util.List;
import java.util.Random;
public class Main {
public static void main(String[] args) {
List<String> colors = List.of("red", "green", "blue");
Random rng = new Random();
String pick = colors.get(rng.nextInt(colors.size()));
System.out.println("Chosen: " + pick);
}
}Перемешивание массива
У массивов нет встроенного перемешивания. Классический подход — алгоритм Фишера — Йетса: обменивать каждый элемент со случайным индексом, не превосходящим текущий.
import java.util.Arrays;
import java.util.Random;
public class Main {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
Random rng = new Random(3);
for (int i = arr.length - 1; i > 0; i--) {
int j = rng.nextInt(i + 1);
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
System.out.println(Arrays.toString(arr));
}
}Случайная выборка
Чтобы выбрать несколько различных элементов, перемешайте копию и возьмите первые несколько либо используйте Set для отслеживания уже выбранных индексов. Для небольших списков проще всего перемешать список, а затем взять срез.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> pool = new ArrayList<>(List.of(1, 2, 3, 4, 5, 6, 7, 8));
Collections.shuffle(pool);
List<Integer> sample = pool.subList(0, 3);
System.out.println("Sample: " + sample);
}
}Практические замечания
Перемешивайте данные, когда нужен полный случайный порядок; используйте формулу произвольного диапазона, когда нужны значения в заданных границах. Всегда помните об ошибке на единицу, если верхняя граница должна включаться.
Быстрая проверка
Проверьте, насколько хорошо Вы поняли диапазоны и перемешивание.
Повторение
Вы изучили диапазоны и перемешивание.
- Для диапазонов используйте
min + nextInt(max - min + 1)илиnextInt(origin, bound). Collections.shuffleменяет порядок элементов изменяемого списка непосредственно в нём.- Задавайте начальное значение для воспроизводимости перемешивания.
- Выбирайте случайные элементы с помощью случайного индекса.
Часто задаваемые вопросы
Урок «Случайные диапазоны и перемешивание» бесплатный?
Да — полный текст урока «Случайные диапазоны и перемешивание» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «Случайные диапазоны и перемешивание»?
Ограниченные случайные значения и перемешивание коллекций Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Случайные диапазоны и перемешивание»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Класс Math
- Генерация случайных чисел
- Случайные диапазоны и перемешивание
- Округление и ограничения в Math