0Pricing
Java Academy · Урок

Случайные диапазоны и перемешивание

Ограниченные случайные значения и перемешивание коллекций

«Случайные диапазоны и перемешивание» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Класс Math
  2. Генерация случайных чисел
  3. Случайные диапазоны и перемешивание
  4. Округление и ограничения в Math
← Назад к Java Academy