Курс по стандартной библиотеке: https://stepik.org/a/259466?utm_source=proproprogs
На этом занятии речь
пойдет о модуле random. Подробно о нем можно почитать на
странице официальной документации:
https://docs.python.org/3/library/random.html
Видим здесь
множество различных функций для генерации случайных значений (а точнее,
псевдослучайных, то есть, их, все же можно просчитать). Мы с вами затронем некоторые
из функций этого модуля, которые наиболее часто используются на практике.
Именно поэтому модуль random не следует
использовать в задачах криптозащиты и подобных приложениях, т.к. злоумышленнику
не составит большого труда воспроизвести эти псевдослучайные значения. Это
обстоятельство следует хорошо запомнить и применять функции модуля random исключительно в научных,
игровых и других не критичных приложениях.
Функции генерации псевдослучайных величин с разными распределениями
Вначале этот
модуль нужно импортировать. В самом простом случае это делается командой:
И, далее, из
пространства имен random можно выбирать самые разные функции
этого модуля. Вначале я воспользуюсь функцией random():
a = random.random()
print(a)
Она при каждом
вызове выдает случайное значение в диапазоне [0.0; 1.0). Обратите внимание, что
числа подчиняются равномерному закону распределения, то есть, в диапазоне [0.0;
1.0) они могут принимать любое значение с равной вероятностью.
Другая похожая
функция uniform(a, b) также
генерирует случайные значения по равномерному закону, но в диапазоне от a до b:
Если нам нужно
моделировать целочисленные случайные значения с тем же равномерным
распределением, то можно использовать или функцию:
a = random.randint(-3, 7) # [-3; 7]
или функцию randrange:
a = random.randrange(5)
b = random.randrange(-3, 10, 2)
Однако часто на
практике требуются случайные величины с другим законом распределения –
гауссовским (или, еще говорят, нормальным). Закон распределения имеет следующий
вид и определяется двумя параметрами: математическим ожиданием (средним
значением) и среднеквадратическим отклонением (мерой разброса относительно МО).
Особенность этих
величин в том, что они чаще появляются в области МО и реже на более дальних
расстояниях. Ценность этого распределения в том, что ему часто подчиняются
многие реальные события: колебания цен на нефть, и различных товаров, шумы при
радиопередачах, погрешности измерений различных значений и т.п. Это
распределение окружает нас повсюду! И, конечно же, нужно уметь его
моделировать. Для этого в Python существует
функция gauss(mu, sigma):
Функции для работы с последовательностями
Все это функции,
которые генерируют по одному случайному значению. Однако имеется весьма
полезный набор функций для работы с последовательностями. Предположим, у нас
имеется список:
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(), например, следующим
образом:
Здесь число 123
– это, как раз и есть значение зерна. Оно задает некое начальное состояние
датчика псевдослучайных чисел, поэтому, запуская программу снова и снова, будем
каждый раз видеть одни и те же случайные значения в списке.
Если выбрать
другое значение зерна, то изменится и последовательность СВ. Это бывает очень
удобно, не сохраняя последовательность случайных чисел, указывать только
значение зерна для их генератора.
Вот такие основные,
базовые возможности существуют в библиотеке random, которые следует
знать и, по мере необходимости, применять на практике.
Курс по стандартной библиотеке: https://stepik.org/a/259466?utm_source=proproprogs