Стандартный генератор случайных чисел в модуле random
Модуль random для генерации случайных чисел
В Python все основные функции случайной генерации собраны в стандартном модуле random. Для работы с этим модулем его необходимо импортировать: import random.
Основной способ получить случайное число с плавающей точкой в диапазоне от 0 до 1 использует функцию random.random(). Она не принимает аргументов и возвращает значение типа float.
import random
number = random.random()
print(number)функция случайного числа python (функция генерации случайного числа в python)
0.607194312935
Полученное значение можно масштабировать в любой интервал. Для случайного числа от 10 до 20 выражение выглядит так: 10 + random.random() * 10.
import random
left = 10
right = 20
value = left + random.random() * (right - left)
print(value)
14.258631097418
Эта же схема применяется, когда нужно смоделировать равномерное распределение на произвольном отрезке.
Как получить случайное целое число включительно по обеим границам?
Функция random.randint(a, b) возвращает случайное целое число от a до b включительно. Обе границы входят в диапазон, поэтому при вызове random.randint(1, 6) возможны значения 1, 2, 3, 4, 5 и 6.
import random
dice = random.randint(1, 6)
print(dice)
4
Как исключить правую границу или задать шаг генерации?
Для этого предназначена random.randrange(start, stop, step). Правая граница не входит в диапазон, как в функции range. Параметр step задаёт приращение.
import random
print(random.randrange(0, 10))
print(random.randrange(0, 10, 2))
7 4
Как получить случайное дробное число в конкретном интервале?
Функция random.uniform(a, b) возвращает float, расположенный между a и b. Ряд реализаций допускает случай, когда a больше b, тогда результат будет между b и a.
import random
temperature = random.uniform(36.0, 37.5)
print(temperature)
36.842781904
Как выбрать случайный элемент из списка, строки или кортежа?
Функция random.choice(seq) берёт один случайный элемент последовательности. Чтобы получить несколько таких элементов с возможными повторами, применяют random.choices(seq, k). Для нескольких уникальных элементов используют random.sample(seq, k).
import random
items = ['a', 'b', 'c', 'd']
print(random.choice(items))
print(random.choices(items, k=3))
print(random.sample(items, k=2))
c ['a', 'b', 'd'] ['d', 'a']
Как перемешать элементы списка?
Метод random.shuffle(x) перемешивает список на месте и возвращает None. Исходный список изменяется, поэтому сохранять результат в переменную не нужно.
import random
cards = ['A', 'K', 'Q', 'J']
random.shuffle(cards)
print(cards)
['J', 'K', 'A', 'Q']
Как сделать серию случайных чисел воспроизводимой?
Функция random.seed(x) инициализирует генератор случайных чисел. После одинакового seed одна и та же последовательность вызовов даёт одинаковый результат.
import random
random.seed(7)
print(random.random())
random.seed(7)
print(random.random())
0.32383276483316237 0.32383276483316237
Частая ошибка: отсутствует импорт модуля. Если написать random.random() без import random, интерпретатор выдаст NameError. Способ решения: разместить import random в начале скрипта.
Другая ошибка: имя переменной random перекрывает имя модуля. После присваивания random = 5 обращение к функциям модуля становится невозможным. Для решения не следует выбирать имя random для переменных.
В random.randint обе границы включены. Тот, кто привык к диапазонам range, часто ждёт, что правая граница не входит, но это не так. В random.randrange правая граница исключена, что тоже следует учитывать. Способ решения: выбирать функцию по ожидаемому поведению границ.
При выборе из пустой последовательности random.choice вызывает IndexError, а sample с k больше длины последовательности вызывает ValueError. Перед вызовом следует проверять длину последовательности и размер k.
Расширенные примеры с функциями random
Для большинства примеров вывод в блоке ex_r показывает один из возможных результатов. При повторном запуске числа могут отличаться.
Генерация случайного целого с помощью getrandbits
Функция random.getrandbits(k) возвращает целое число, которое помещается в k двоичных разрядов. Диапазон значений от 0 до 2^k - 1.
import random
print(random.getrandbits(8))
print(random.getrandbits(16))
139 40785
Воспроизводимая последовательность после seed
import random
random.seed(5)
print(random.random())
random.seed(5)
print(random.random())
0.6229016948897019 0.6229016948897019
Случайный элемент с весами
Аргумент weights задаёт относительную частоту каждого элемента. В примере элемент с индексом 2 появляется чаще остальных.
import random
cities = ['Moscow', 'Saint Petersburg', 'Novosibirsk']
weights = [2, 5, 1]
print(random.choices(cities, weights=weights, k=10))
['Saint Petersburg', 'Moscow', 'Saint Petersburg', 'Saint Petersburg', 'Novosibirsk', 'Moscow', 'Saint Petersburg', 'Saint Petersburg', 'Saint Petersburg', 'Saint Petersburg']
Кумулятивные веса в random.choices
Параметр cum_weights принимает уже суммированные значения. Например, список [3, 7, 10] означает: первый элемент с весом 3, второй с 4, третий с 3.
import random
cumulative = [3, 7, 10]
print(random.choices(['A', 'B', 'C'], cum_weights=cumulative, k=8))
['B', 'B', 'C', 'A', 'C', 'B', 'B', 'C']
Выбор нескольких уникальных элементов с учётом повторов
Параметр counts расширяет список без создания отдельного объекта. Запись counts=[2, 1, 3] даёт набор a, a, b, c, c, c.
import random
letters = ['a', 'b', 'c']
counts = [2, 1, 3]
print(random.sample(letters, counts=counts, k=3))
['c', 'a', 'c']
Случайное число из треугольного распределения
import random
print(random.triangular(0, 100, 70))
52.307181475048
Нормально распределённое случайное значение
import random
print(random.gauss(0, 1))
-0.539077549865
Случайная величина из экспоненциального распределения
import random
print(random.expovariate(1.5))
1.10248420805
Системный генератор SystemRandom
Класс random.SystemRandom использует источник случайности операционной системы. Его поведение не зависит от seed и не воспроизводится.
import random
sr = random.SystemRandom()
print(sr.random())
print(sr.randint(1, 100))
print(sr.choice(['red', 'green', 'blue']))
0.928759248593 54 green
Собственный экземпляр Random
Через random.Random() создаётся отдельный генератор с собственным состоянием.
import random
generator = random.Random(123)
print(generator.random())
0.052363598850944326
Перемешивание списка чисел
import random
deck = list(range(1, 11))
random.shuffle(deck)
print(deck)
[8, 3, 9, 1, 10, 5, 2, 6, 4, 7]
Случайный символ из строки
import random
symbol = random.choice('abcdef')
print(symbol)
e
Лотерейный билет без повторов
import random
ticket = random.sample(range(1, 50), 6)
print(sorted(ticket))
[7, 18, 25, 31, 36, 44]
Список случайных float с округлением
import random
prices = [round(random.uniform(100, 200), 2) for _ in range(5)]
print(prices)
[121.74, 189.08, 145.21, 166.53, 198.12]
Равномерное число на произвольном отрезке без uniform
import random
left = 5
right = 15
value = left + (right - left) * random.random()
print(value)
7.91286124444
Случайные байты в hex
Функция random.randbytes появилась в Python 3.9. Метод hex превращает байты в строку без управляющих символов.
import random
print(random.randbytes(4).hex())
9c3ef102