Полное руководство по работе с модулем `random` в Python

Полное руководство по работе с модулем `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 для сложных распределений.