Модуль random: генерация псевдослучайных чисел в Python

Многим компьютерным приложениям необходимо генерировать случайные числа. Однако ни одно из них не генерирует действительно случайное число. Python, как и многие другие языки программирования, использует генератор псевдослучайных чисел. Генерация случайных чисел в Python основана на алгоритме Вихрь Мерсенна. Этот метод быстрый и потокобезопасный, но не подходит для криптографических целей.

Стандартная библиотека Python содержит модуль random, в котором есть различные функции для работы со случайными числами.

random.seed([initializer]) – этот метод инициализирует генератор случайных чисел. Когда модуль random импортируется, генератор инициализируется с помощью системного времени. Чтобы повторно запустить генератор, используйте любой объект int, str, byte или bytearray. При помощи этого метода можно воспроизводить одну и ту же последовательность чисел любое количество раз. В примере ниже генератор случайных чисел инициализируется с помощью числа 2 и при каждом запуске программы мы будем получать одну и ту же последовательность чисел.

import random

random.seed(2)
random_number_1 = random.randint(1, 10)
random_number_2 = random.randint(1, 10)

print(random_number_1, random_number_2) # 1 2

random.getstate() — эта функция вместе с функцией setstate() помогает воспроизводить одни и те же случайные данные снова и снова. Функция getstate() возвращает внутреннее состояние генератора случайных чисел. Больше информации вы можете найти по ссылке.

random.setstate(state) — эта функция восстанавливает внутреннее состояние генератора.


Следующие функции предназначены для генерации случайных целых чисел:

random.randrange() − эта функция генерирует случайное целое число в пределах заданного диапазона чисел. Может принимать три параметра.

random.randrange([start], stop[, step])

Параметры start и step являются необязательными. Их значения по умолчанию равны 0 и 1 соответственно. Шаг (step) определяет интервал между последовательными числами.

>>> random.randrange(10)
5
>>> random.randrange(10, 20)
17
>>> random.randrange(100, 200, 2)
188

Примечание: помните, что выходные данные примеров в этой статье могут не совпадать, так как они генерируются случайным образом.

random.randint(start, stop) — эта функция генерирует случайное целое число x, такое что start ≤ x ≤ stop. Это похоже на функцию randrange() без параметра step.

>>> random.randint(1,10)
6
>>> random.randint(100, 200)
134

Следующие функции работают со случайными числами с плавающей запятой:

random.random() — эта функция генерирует случайное число с плавающей запятой в диапазоне от 0.0  до 1.0.

>>> random.random()
0.668544544081956

random.uniform(start, stop) — эта функция возвращает случайное число x с плавающей запятой, такое что start ≤ x ≤ stop для start ≤ stop и stop ≤ x ≤ start для stop < start.

>>> random.uniform(0.5,1.5)
1.2760281470664903
>>> random.uniform(1,10)
7.336985794193224
>>> random.uniform(10,5)
7.817794757786727

Следующие функции работают c последовательностями, а именно — со строками, списками или кортежами:

random.choice() − эта функция выбирает случайный элемент из последовательности. Если последовательность пуста, то возникает ошибка IndexError.

>>> random.choice("Pythonist")
'o'
>>> random.choice(range(10))
2
>>> random.choice([15,31,6,29,55, 5])
55
>>> random.choice((15,31,6,29,25, 55))
15

random.choices() − эта функция случайным образом выбирает несколько элементов из списка. Первый параметр этой функции — последовательность, а второй — количество элементов, которые нужно вернуть. Возвращает список, в котором  может повторяться несколько раз один и тот же элемент.

>>> name = "Pythonist"
>>> random.choices(name, k = 2)
['s', 'n']

random.shuffle() — эта функция переупорядочивает (перемешивает) элементы в изменяемой (mutable) последовательности и размещает их случайным образом.

>>> num = [10,20,30,40,50]
>>> random.shuffle(num)
>>> num
[50, 20, 40, 30, 10]

random.sample(sequence, n)  — эта функция возвращает список случайно выбранных элементов из последовательности. Результирующий список содержит только уникальные элементы.

>>> name = "Pythonist"
>>> nm = random.sample(name, k = 5)
>>> name, nm
(Pythonist, ['n', 'P', 'y', 't', 'h'])

Более подробную информацию о функциях модуля random вы можете найти в документации.