Модуль 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 — работу с датами, временем и временными интервалами.