Модуль random стандартной библиотеки

Курс по стандартной библиотеке: https://stepik.org/a/259466?utm_source=proproprogs

Смотреть материал на YouTube | RuTube

На этом занятии речь пойдет о модуле random. Подробно о нем можно почитать на странице официальной документации:

https://docs.python.org/3/library/random.html

Видим здесь множество различных функций для генерации случайных значений (а точнее, псевдослучайных, то есть, их, все же можно просчитать). Мы с вами затронем некоторые из функций этого модуля, которые наиболее часто используются на практике. Именно поэтому модуль random не следует использовать в задачах криптозащиты и подобных приложениях, т.к. злоумышленнику не составит большого труда воспроизвести эти псевдослучайные значения. Это обстоятельство следует хорошо запомнить и применять функции модуля random исключительно в научных, игровых и других не критичных приложениях.

Функции генерации псевдослучайных величин с разными распределениями

Вначале этот модуль нужно импортировать. В самом простом случае это делается командой:

import random

И, далее, из пространства имен random можно выбирать самые разные функции этого модуля. Вначале я воспользуюсь функцией random():

a = random.random()
print(a)

Она при каждом вызове выдает случайное значение в диапазоне [0.0; 1.0). Обратите внимание, что числа подчиняются равномерному закону распределения, то есть, в диапазоне [0.0; 1.0) они могут принимать любое значение с равной вероятностью.

Другая похожая функция uniform(a, b) также генерирует случайные значения по равномерному закону, но в диапазоне от a до b:

a = random.uniform(1, 5)

Если нам нужно моделировать целочисленные случайные значения с тем же равномерным распределением, то можно использовать или функцию:

a = random.randint(-3, 7)   # [-3; 7]

или функцию randrange:

a = random.randrange(5)
b = random.randrange(-3, 10, 2)

Однако часто на практике требуются случайные величины с другим законом распределения – гауссовским (или, еще говорят, нормальным). Закон распределения имеет следующий вид и определяется двумя параметрами: математическим ожиданием (средним значением) и среднеквадратическим отклонением (мерой разброса относительно МО).

Особенность этих величин в том, что они чаще появляются в области МО и реже на более дальних расстояниях. Ценность этого распределения в том, что ему часто подчиняются многие реальные события: колебания цен на нефть,  и различных товаров, шумы при радиопередачах, погрешности измерений различных значений и т.п. Это распределение окружает нас повсюду! И, конечно же, нужно уметь его моделировать. Для этого в Python существует функция gauss(mu, sigma):

a = random.gauss(0, 3.5)

Функции для работы с последовательностями

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

lst = [4, 5, 0, -1, 10, 76, 3]

и мы хотим выбрать из него один элемент случайным образом. Для этого можно воспользоваться функцией:

a = random.choice(lst)
print(a)

После запуска видим случайно выбранное значение из списка lst.

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

random.shuffle(lst)
print(lst)

Причем, меняет сам список, поэтому работает только с изменяемыми коллекциями.

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

a = random.sample(lst, 3)
print(a)

Разумеется, максимальное число элементов не может превышать размер самого списка lst.

Функция seed()

И последнее, что я хочу отметить в работе с псевдослучайными величинами, это возможность формировать одинаковые случайные последовательности чисел при каждом новом запуске программы. О чем здесь речь? Смотрите, если мы, например, генерируем несколько целочисленных случайных величин:

a = [random.randint(0, 10) for i in range(20)]
print(a)

То, запуская программу снова и снова, будем видеть разные случайные значения в списке a. Часто именно так и должен работать генератор случайных величин. Но иногда требуется, чтобы каждый запуск программы приводил к одной и той же последовательности случайных чисел. Например, для повторяемости результатов экспериментов на разных компьютерах. Для этого нужно зафиксировать, так называемое, зерно генератора случайных значений с помощью функции seed(), например, следующим образом:

random.seed(123)

Здесь число 123 – это, как раз и есть значение зерна. Оно задает некое начальное состояние датчика псевдослучайных чисел, поэтому, запуская программу снова и снова, будем каждый раз видеть одни и те же случайные значения в списке.

Если выбрать другое значение зерна, то изменится и последовательность СВ. Это бывает очень удобно, не сохраняя последовательность случайных чисел, указывать только значение зерна для их генератора.

Вот такие основные, базовые возможности существуют в библиотеке random, которые следует знать и, по мере необходимости, применять на практике.

Курс по стандартной библиотеке: https://stepik.org/a/259466?utm_source=proproprogs

Видео по теме