Программирование • 20 ноября 2024 • 5 мин чтения

Как работать с модулем random в Python

Рассказываем о модуле random в Python: как он работает и какие функции в нём есть. Описываем методы его использования в программировании и приводим примеры кода.

Зачем нужен модуль

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

В отличие от других элементов Python, допустим массивов или ссылок, разработчики, которые пишут код на «Питоне», не пользуются модулем постоянно. Он предназначен для решения узкоспециализированных задач: 

  • Генерация чисел. Модуль random позволяет создавать уникальные идентификаторы, к примеру номера транзакций или пароли.
  • Перемешивание объектов. С помощью этого метода есть возможность расположить элементы списка в случайном порядке.
  • Создание зерна генерации. Иногда алгоритмам требуются случайные значения для выдачи разных результатов. Допустим, для создания ответов в чате GPT берётся какая-то случайная величина, которая называется зерном генерации, или seed, для того чтобы результаты были всегда разными. Или, наоборот, эту величину фиксируют для того, чтобы нейросеть воспроизводила одинаковые ответы на конкретные вопросы.
  • Криптография. Иногда random в «Питоне» может быть полезен, к примеру, для создания ключей шифрования, состоящих из случайных значений.
  • Моделирование. Модуль random позволяет генерировать данные, которые соответствуют определённым распределениям. Это помогает анализировать и прогнозировать различные явления.
  • Машинное обучение. Генерация случайных данных используется для обучения и тестирования моделей ML (machine learning), помогая им адаптироваться к различным ситуациям и повышать точность.
  • Эксперименты. Некоторые применяют модуль random при тестировании. Однако это не всегда эффективно, потому что тесты становятся рандомизированными и ошибки не будут воспроизводиться. 

Разобраться, как использовать модуль random при решении конкретных задач, поможет курс «Python-разработчик». Программа занятий позволит изучить бэкенд с нуля за 9 месяцев под руководством опытных экспертов из Яндекса и других крупных компаний. Студенты освоят фреймворк Django, научатся работать с полезными инструментами, например с GitHub, PostgreSQL и Nginx, а по окончании курса составят портфолио, которое поможет в поиске работы.

Установка и импорт модуля

Модуль random по умолчанию есть в Python, поэтому программисту не нужно устанавливать его отдельно. Разработчик может сразу начать применять его функции, после того как импортирует модуль в код.

Сделать это можно тремя способами.

1. Команда import random. Написав эту строчку кода, можно использовать любую функцию. Для этого нужно вызвать её через команду и название, разделённые точкой без пробелов. Допустим, чтобы получить случайное целое число, необходимо запустить randint:

import random
random_integer = random.randint(0, 100)
print(random_integer)

2. Команда from random import *. Такой способ позволяет вызывать функции, не указывая имя модуля. Допустим, так можно получить рандомное число от 0 до 1:

from random import *
random_integer = random(0, 1)
print(random_integer)

3. Команда from random import [название функции]. Даёт возможность вызвать конкретные функции модуля, не импортируя его целиком. Например, так:

from random import shuffle
result = shuffle(sequence)
print(result)

Основные функции модуля random

Чтобы понять, как работает модуль random в Python, нужно понять его возможности. Разберём ключевые функции, которые чаще всего применяют программисты на «Питоне»: 

  • randint — выдаёт рандомное целое число в промежутке значений с a по b;
  • randrange — генерирует случайное число в определённом диапазоне с нужным шагом;
  • random — работает для возврата рандомного вещественного числа от нуля до единицы, не включая последнюю;
  • uniform — аналогична randint, но выдаёт числа с плавающей точкой из заданного промежутка;
  • choice — используется для выбора рандомного элемента последовательности;
  • shuffle — перемешивает элементы в заданной последовательности на месте;
  • sample — создаёт случайную выборку элементов из последовательности;
  • seed — определяет начальную точку генерации;
  • getstate — используется для восстановления и сохранения текущего состояния генератора случайных чисел;
  • setstate — вызывает последний сохранённый вариант генератора.
Синтаксис основных методов модуля random в Python

Эти функции random применяют как начинающие, так и опытные Python-разработчики. При этом программисты, которые глубоко погружены в язык, вместе с модулем также пользуются продвинутыми библиотеками. Допустим, для научных целей в связке с random пригодится SciPy — набор функций, который включает в себя методы оптимизации, линейной алгебры и статистики. Вместе они будут полезны, например, если стоит задача провести статистический анализ данных с рандомными величинами.

Также в модуле random есть большое количество распределений — к примеру, нормальное, гауссово или биномиальное. Они дают возможность генерировать случайные величины с конкретными параметрами.

Примеры применения модуля random

Сортировка

Самый распространённый пример применения модуля random в работе программистов — написание кода быстрой сортировки, или сортировки Хоара (quicksort). Эта функция рекурсивно меняет расположение элементов в массиве, рандомно выбирая один из них в качестве опорного (pivot). Массив при этом делится на три части элементов:

● меньше опорного элемента;
● равные опорному элементу;
● больше опорного элемента.

Такая сортировка называется быстрой, потому что за счёт вероятностного выбора опорного элемента она работает быстрее, чем обычный алгоритм. Как гласит теорема о нижней границе сложности сортировки, для любого алгоритма сортировки, работающего на произвольном массиве, невозможно достичь лучшей временной сложности, чем O(n log n) — то есть определённого количества логарифмов за определённое число операций. Но быстрая сортировка с помощью модуля random делает это быстрее.

Пример кода:

import random

def quicksort(arr):
if len(arr) < 2:
return arr
else:
pivot = random.choice(arr)
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]

return quicksort(left) + middle + quicksort(right)

# Пример использования функции quicksort:

my_array = [3, 1, 4, 6, 2, 5]
sorted_array = quicksort(my_array)
print("Отсортированный массив:", sorted_array)

Генерация случайных величин

Рассмотрим пример использования модуля random для генерации случайных автомобильных номеров. Код будет таким:

import random

# Генерация случайного номера
def generate_car_number():
# Определение допустимых символов для букв
letters = 'АВЕКМНОРСТУХ'

# Генерация случайных букв
first_letter = random.choice(letters)
second_letter = random.choice(letters)

# Определение допустимых цифр
digits = '0123456789'

# Генерация случайных цифр
number_part_1 = ''.join(random.choice(digits) for _ in range(3))
number_part_2 = ''.join(random.choice(digits) for _ in range(3))

return '{}{}{}{}'.format(first_letter, number_part_1, second_letter, number_part_2)

# Выводим сгенерированный номер
print(generate_car_number())

Этот код создаёт случайный автомобильный номер, состоящий из двух букв и двух наборов по три цифры.

Перемешивание и случайный выбор

Пример для опытных разработчиков — написание кода, который перемешивает список имён, выбирает случайных подопечных для игры «Тайный Санта» и отправляет им письма на почту. Для отправки писем на Python можно использовать библиотеки **smtplib** и **email**. Однако чтобы код работал, необходимо указать сервер, логин и пароль от почты, которая используется для рассылки. У всех почтовых сервисов, например у Яндекс Почты, есть SMTP-сервер, через который можно рассылать письма. Его данные и нужно добавить.

Пример кода:

import random
from email.message import EmailMessage
from smtplib import SMTP

# Создание списка имён
names = ['Иван', 'Мария', 'Сергей', 'Ольга', 'Дмитрий', 'Анна', 'Владимир', 'Елена', 'Александр', 'Наталья', 'Михаил', 'Татьяна', 'Константин', 'Артём', 'Ирина', 'Павел', 'Виктория', 'Евгений', 'Юлия', 'Кирилл']

def generate_secret_santa():
# Перемешивание списка имён
random.shuffle(names)
return names

def send_email(name, recipient):
msg = EmailMessage()
msg.set_content(f"Вы выбраны тайным Сантой! Поздравляем! Ваш подопечный — {recipient}.")
msg['Subject'] = "Уведомление от тайного Санты"
msg['From'] = 'your_email@example.com'
msg['To'] = name
server = SMTP('smtp.example.com')
server.starttls()
server.login('your_username', 'your_password')
server.send_message(msg)
server.quit()

# Генерация случайного выбора подопечных
selected_names = generate_secret_santa()
for i in range(len(selected_names)):
name = selected_names[i]
recipient = selected_names[(i + 1) % len(selected_names)] # Выбор случайного подопечного
send_email(name, recipient)

print("Уведомления отправлены!")

Совет эксперта

Артём Стрельцов

В Python есть большое количество стандартных библиотек, которые упрощают рутинную работу программистов, и модуль random — один из них. Конечно, можно написать генератор рандомных чисел с нуля, но это лишние действия, в которых нет необходимости. Именно благодаря стандартной библиотеке «Питона» многие рутинные вещи, например рандомизация или хеширование, работают проще, потому что их не нужно делать вручную.

Конечно, бывают более сложные задачи, связанные, допустим, с математической статистикой, случайными величинами и работой с ними. В этом случае нужно использовать более продвинутые и узкоспециализированные библиотеки, такие как SciPy. Но для начинающих разработчиков модуль random зачастую закрывает 99% задач.

Статью подготовили:
Артём Стрельцов
Яндекс Практикум
Разработчик
Женя Соловьёва
Яндекс Практикум
Редактор
Анастасия Павлова
Яндекс Практикум
Иллюстратор

Дайджест блога: ежемесячная подборка лучших статей от редакции

Поделиться

Успейте начать учебу в Практикуме до конца ноября со скидкой 20%

Wed Nov 20 2024 15:20:54 GMT+0300 (Moscow Standard Time)