Модуль random: случайные числа

Модуль random: случайные числа

После знакомства с math перейдём к другому часто используемому модулю — random. Он предоставляет генератор псевдослучайных чисел и удобные функции для случайного выбора, перемешивания и семплирования.

Случайные числа

import random

# Случайный float в диапазоне [0.0, 1.0):
print(random.random())        # например, 0.7283...

# Случайный float в диапазоне [a, b]:
print(random.uniform(1, 10))  # например, 6.42...

# Случайный int в диапазоне [a, b] (включительно):
print(random.randint(1, 6))   # как бросок кубика: 1, 2, 3, 4, 5 или 6

Обратите внимание: randint(a, b) включает оба конца. Это отличается от range(a, b), где правый конец исключён.

Выбор из последовательности

import random

colors = ["красный", "зелёный", "синий", "жёлтый"]

print(random.choice(colors))       # случайный элемент
print(random.choices(colors, k=3)) # 3 случайных (с повторениями)
print(random.sample(colors, k=3))  # 3 уникальных (без повторений)
  • choice(seq) — один элемент
  • choices(seq, k=n)n элементов с повторениями (как выборка с возвратом)
  • sample(seq, k=n)n уникальных элементов (без возврата)

Перемешивание

import random

deck = list(range(1, 11))   # [1, 2, 3, ..., 10]
random.shuffle(deck)         # перемешивает на месте (in-place)
print(deck)                  # например, [7, 2, 9, 1, 4, ...]

shuffle() изменяет переданный список; не возвращает новый. Чтобы перемешать, не меняя оригинал, используйте random.sample(lst, k=len(lst)).

Воспроизводимость: seed

Генератор псевдослучайных чисел детерминирован при фиксированном начальном значении (seed). Это важно для тестов и воспроизводимых экспериментов:

import random

random.seed(42)
print(random.randint(1, 100))   # всегда 82 при seed=42
print(random.randint(1, 100))   # всегда 15

random.seed(42)   # сброс к тому же seed
print(random.randint(1, 100))   # снова 82

Без вызова seed() Python использует текущее системное время как начальное значение — числа непредсказуемы от запуска к запуску.

Практический пример: простая лотерея

import random

def lottery(participants, winners_count):
    """Выбирает победителей из списка участников."""
    if winners_count > len(participants):
        raise ValueError("Победителей больше, чем участников")
    return random.sample(participants, k=winners_count)

names = ["Алиса", "Борис", "Вера", "Глеб", "Диана"]
winners = lottery(names, 2)
print(f"Победители: {', '.join(winners)}")

Проверь себя

Чем отличаются random.choices и random.sample?

choices — с возвратом: одно и то же значение может появиться несколько раз. sample — без возврата: все выбранные элементы уникальны. Для sample нельзя запросить больше элементов, чем есть в последовательности.

Итог

  • random.random() → float в [0, 1); random.uniform(a, b) → float в [a, b].
  • random.randint(a, b) → int от a до b включительно.
  • random.choice(seq) — один элемент; random.choices(seq, k=n) — с повторениями; random.sample(seq, k=n) — без повторений.
  • random.shuffle(lst) — перемешать список на месте.
  • random.seed(n) — зафиксировать последовательность для воспроизводимости.

В следующем уроке изучим модуль datetime — работу с датами, временем и временными интервалами.

Попробуйте интерактивную версию

Практические задачи, квизы и AI-наставник — бесплатный старт без карты

Перейти к практике