Стандартный генератор случайных чисел в модуле random

Раздел: Основы Python -> Функции 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

Функция генерации случайного числа в Python - comments

En
функция случайного числа python (python)