Полное руководство по работе с модулем `random` в Python
Полное руководство по работе с модулем random в Python
Модуль random в Python предоставляет инструменты для генерации псевдослучайных чисел, выбора случайных элементов и работы с вероятностными распределениями. Это незаменимый инструмент для задач статистики, игр, симуляций, криптографии (с осторожностью!) и машинного обучения. Рассмотрим его функционал детально.
1. Основные функции для генерации чисел
-
random(): Возвращает float в диапазоне[0.0, 1.0).import random print(random.random()) # Пример: 0.548813502 -
uniform(a, b): Равномерное распределение на отрезке[a, b].print(random.uniform(5, 10)) # 7.385247 -
randint(a, b): Целое число в диапазоне[a, b](включительно).print(random.randint(1, 6)) # Случайная игральная кость: 4 -
randrange(start, stop, step): Аналогrange(), но со случайным выбором.print(random.randrange(0, 100, 5)) # Кратное 5: 45
2. Работа с последовательностями
-
choice(seq): Случайный элемент последовательности.items = ['яблоко', 'банан', 'вишня'] print(random.choice(items)) # 'банан' -
choices(seq, weights, k): Выборkэлементов с учетом весов (с повторением).print(random.choices([1, 2, 3], weights=[0.1, 0.8, 0.1], k=5)) # [2, 2, 2, 1, 2] (чаще выбирается 2) -
sample(seq, k): Уникальные элементы (без повторений).print(random.sample(range(100), k=5)) # [42, 15, 73, 88, 31] -
shuffle(seq): Перемешивание списка на месте.cards = ['Туз', 'Король', 'Дама'] random.shuffle(cards) print(cards) # ['Дама', 'Туз', 'Король']
3. Генерация по распределениям
-
gauss(mu, sigma): Нормальное распределение.print(random.gauss(0, 1)) # Пример: -0.124934 -
expovariate(lambda): Экспоненциальное распределение.print(random.expovariate(1.5)) # Для моделирования времени ожидания -
betavariate(alpha, beta),gammavariate(alpha, beta),weibullvariate(alpha, beta): Специализированные распределения для статистики.
4. Управление генератором: Семена (seeds)
Для воспроизводимости результатов задайте начальное значение (seed):
random.seed(42) # Фиксирует последовательность случайных чисел
print(random.randint(0, 100)) # Всегда 81 при seed=42
Важно: Псевдослучайные числа не подходят для криптографии! Используйте secrets.
5. Практические примеры
a) Генератор паролей:
import string
symbols = string.ascii_letters + string.digits + '!@#$%'
password = ''.join(random.choices(symbols, k=12))
print(password) # 'x!3aBq8$zL2K'
b) Моделирование броска монеты:
result = 'Орёл' if random.random() > 0.5 else 'Решка'
c) Выбор случайной даты:
from datetime import datetime, timedelta
start = datetime(2023, 1, 1)
end = datetime(2023, 12, 31)
random_date = start + timedelta(days=random.randint(0, 365))
d) Монте-Карло интегрирование:
def monte_carlo_pi(n):
points_inside = 0
for _ in range(n):
x, y = random.random(), random.random()
if x**2 + y**2 <= 1:
points_inside += 1
return 4 * points_inside / n
print(monte_carlo_pi(100000)) # 3.14108
6. Ограничения и предостережения
- Детерминизм: Генератор зависит от seed. Не используйте для безопасности.
- Распределения: Убедитесь, что выбрали правильное распределение для задачи.
- Производительность: Для больших
kвsampleпредпочтительнееnumpy.random.
7. Альтернативы
numpy.random: Быстрая генерация массивов (виды распределений:normal,poisson).secrets: Криптографически безопасные операции (токены, пароли).import secrets print(secrets.token_hex(16)) # 'a3f8d7...'
Заключение
Модуль random — мощный инструмент для работы со случайностью в Python. Его простота и разнообразие функций охватывают большинство повседневных задач: от симуляций до игровой логики. Помните о природе псевдослучайности, используйте seed для воспроизводимости и переходите к numpy.random или secrets для специализированных сценариев.
Дальнейшее изучение:
- Документация Python: random — Generate pseudo-random numbers
- Модуль
statisticsдля анализа данных.- Библиотека
scipy.statsдля сложных распределений.