Случайные значения в Python: работа с генератором чисел random

Раздел: Библиотека 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]

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

En
Random числа python (python)