Случайные значения в Python: работа с генератором чисел random
Модуль random в Python предоставляет инструменты для генерации псевдослучайных чисел. Он широко применяется в моделировании, играх, тестировании и других задачах, где требуется случайность. Важно понимать, что генерируемые числа не являются истинно случайными, но для большинства приложений их достаточно.
Основные функции модуля random
Наиболее эффективный подход для базовых сценариев - использование функций randint, random и choice. Они покрывают более 80% типовых запросов: целые числа, числа с плавающей запятой и случайный выбор элемента.
import random
# Случайное целое от 1 до 10
print(random.randint(1, 10))
# Случайное вещественное от 0 до 1
print(random.random())
# Выбор случайного элемента из списка
colors = ['red', 'green', 'blue']
print(random.choice(colors))Python случайное число в диапазоне (генерация случайного числа в заданном диапазоне в python)
7 0.456789 'blue'
Python список случайных чисел (генерация списка случайных чисел в python)
Функция random.seed() позволяет зафиксировать начальное состояние генератора, чтобы воспроизводить последовательность при повторных запусках. Это полезно для отладки и тестов.
Как получить случайное целое число в заданном диапазоне?
Для этого применяются randint (включает обе границы) и randrange (может задавать шаг).
print(random.randint(1, 6)) # бросок кубика
print(random.randrange(0, 10, 2)) # чётное от 0 до 8
Random числа python (генерация случайных чисел в python)
Типичная ошибка: путаница между randint(a,b) и randrange(a,b). Первый включает b, второй - нет (как range).
Как получить случайное вещественное число в произвольном диапазоне?
Функция uniform(a,b) возвращает число из равномерного распределения на отрезке [a, b].
print(random.uniform(2.5, 5.0))Python random int (генерация случайных целых чисел в python)
3.7891
Возможная проблема: если требуется строго полуинтервал [0, 1), лучше использовать random.random() и масштабировать результат.
Как случайным образом выбрать элемент из списка?
choice(seq) выбирает один элемент. choices(seq, k=n) выбирает n элементов с возможностью повторов (с возвращением).
numbers = [1, 2, 3, 4, 5]
print(random.choice(numbers))
print(random.choices(numbers, k=3))
4 [2, 1, 4]
Как перемешать элементы списка на месте?
Функция shuffle(lst) изменяет исходный список случайным образом. Она модифицирует последовательность, поэтому для неизменяемых типов её нельзя использовать напрямую.
deck = ['A', 'K', 'Q', 'J']
random.shuffle(deck)
print(deck)
['Q', 'A', 'J', 'K']
Распространённая ошибка: попытка перемешать кортеж или строку. Перед перемешиванием их следует преобразовать в список.
Как получить несколько неповторяющихся элементов из последовательности?
sample(population, k) возвращает случайную выборку без повторений указанного размера.
names = ['Alice', 'Bob', 'Charlie', 'Diana']
print(random.sample(names, 2))
['Bob', 'Diana']
Как обеспечить воспроизводимость случайных чисел?
Вызов random.seed(x) инициализирует генератор заданным значением. После этого последовательность вызовов будет одинаковой при одном и том же seed.
random.seed(42)
print(random.random())
random.seed(42)
print(random.random())
0.6394267984578837 0.6394267984578837
Важно: если не вызвать seed, Python использует системное время. Для отладки полезно явно задавать фиксированное значение.
Как генерировать числа с нормальным распределением?
Функции gauss(mu, sigma) и normalvariate(mu, sigma) возвращают случайные числа из нормального (гауссова) распределения с заданным средним и стандартным отклонением.
print(random.gauss(0, 1)) # стандартное нормальное
0.1256
Как получить криптографически стойкие случайные числа?
Модуль random не подходит для задач безопасности. Вместо него используется модуль secrets (Python 3.6+). Он предоставляет функции randbelow(n), choice(seq) и token_hex().
import secrets
print(secrets.randbelow(100)) # случайное от 0 до 99
print(secrets.choice(['a','b','c'])) # безопасный выбор
print(secrets.token_hex(8)) # 16-символьный шестнадцатеричный токен
73 'b' 'a1b2c3d4e5f6g7h8'
Распространённая ошибка: использование random для генерации паролей или токенов. Модуль secrets создан именно для этих целей и гарантирует устойчивость к атакам.
Расширенные примеры работы с модулем random
Симуляция броска двух игральных костей
Моделируется сумма двух кубиков. Используется randint и подсчёт частоты.
import random
rolls = {i:0 for i in range(2,13)}
for _ in range(10000):
d1 = random.randint(1,6)
d2 = random.randint(1,6)
rolls[d1+d2] += 1
print(rolls)
{2: 278, 3: 559, 4: 833, 5: 1111, 6: 1389, 7: 1667, 8: 1406, 9: 1091, 10: 836, 11: 537, 12: 293}
Тасование колоды карт и раздача
Создаётся колода из 52 карт, перемешивается и раздаётся по 5 карт четырём игрокам.
import random
suits = ['♠','♥','♦','♣']
ranks = ['2','3','4','5','6','7','8','9','10','J','Q','K','A']
deck = [r+s for s in suits for r in ranks]
random.shuffle(deck)
players = {i: [] for i in range(4)}
for i, card in enumerate(deck):
if i < 20: # раздаём первые 20 карт
players[i % 4].append(card)
for p in players:
print(f"Игрок {p}: {players[p]}")
Игрок 0: ['7♣', 'A♦', '5♠', '3♣', '10♠'] Игрок 1: ['Q♥', '4♦', 'J♣', '8♠', '2♠'] Игрок 2: ['K♥', '9♣', '6♦', 'J♥', 'A♠'] Игрок 3: ['3♦', '8♥', '10♥', 'Q♠', '7♥']
Генерация случайного пароля из букв, цифр и символов
Используется secrets для надёжности.
import secrets
import string
alphabet = string.ascii_letters + string.digits + string.punctuation
password = ''.join(secrets.choice(alphabet) for _ in range(12))
print(password)
aB3@xY9!zQ7#
Моделирование случайного блуждания
Точка стартует в начале координат и за каждый шаг смещается на случайную величину в интервале (-1, 1) по каждой оси.
import random
x, y = 0.0, 0.0
for _ in range(1000):
x += random.uniform(-1, 1)
y += random.uniform(-1, 1)
print(f"Конечное положение: ({x:.2f}, {y:.2f})")
Конечное положение: (12.34, -8.21)
Использование seed для воспроизводимости в тестах
Фиксированный seed позволяет получить одинаковые «случайные» данные при каждом запуске, что упрощает отладку.
import random
random.seed(12345)
data = [random.randint(1, 100) for _ in range(5)]
print(data)
# При повторном запуске с тем же seed результат будет таким же
[32, 87, 56, 44, 9]