- Python 3: Генерация случайных чисел (модуль random)¶
- random.random¶
- random.seed¶
- random.uniform¶
- random.randint¶
- random.choince¶
- random.randrange¶
- random.shuffle¶
- Вероятностные распределения¶
- Примеры¶
- Генерация произвольного пароля¶
- Ссылки¶
- Модуль random. Часть 1
- Случайная величина
- Вероятность случайной величины
- Классическая (теоретическая) вероятность
- Относительная (эмпирическая) вероятность
- Закон больших чисел
- Модуль random библиотеки Numpy
- Подбрасывание монеты
Python 3: Генерация случайных чисел (модуль random)¶
Python порождает случайные числа на основе формулы, так что они не на самом деле случайные, а, как говорят, псевдослучайные [1]. Этот способ удобен для большинства приложений (кроме онлайновых казино) [2].
[1] | Википедия: Генератор псевдослучайных чисел |
[2] | Доусон М. Программируем на Python. — СПб.: Питер, 2014. — 416 с.: ил. — 3-е изд |
Модуль random позволяет генерировать случайные числа. Прежде чем использовать модуль, необходимо подключить его с помощью инструкции:
random.random¶
random.random() — возвращает псевдослучайное число от 0.0 до 1.0
random.random() 0.07500815468466127
random.seed¶
random.seed() — настраивает генератор случайных чисел на новую последовательность. По умолчанию используется системное время. Если значение параметра будет одиноким, то генерируется одинокое число:
random.seed(20) random.random() 0.9056396761745207 random.random() 0.6862541570267026 random.seed(20) random.random() 0.9056396761745207 random.random() 0.7665092563626442
random.uniform¶
random.uniform(, ) — возвращает псевдослучайное вещественное число в диапазоне от до :
random.uniform(0, 20) 15.330185127252884 random.uniform(0, 20) 18.092324756265473
random.randint¶
random.randint(, ) — возвращает псевдослучайное целое число в диапазоне от до :
random.randint(1,27) 9 random.randint(1,27) 22
random.choince¶
random.choince() — возвращает случайный элемент из любой последовательности (строки, списка, кортежа):
random.choice('Chewbacca') 'h' random.choice([1,2,'a','b']) 2 random.choice([1,2,'a','b']) 'a'
random.randrange¶
random.randrange(, , ) — возвращает случайно выбранное число из последовательности.
random.shuffle¶
random.shuffle() — перемешивает последовательность (изменяется сама последовательность). Поэтому функция не работает для неизменяемых объектов.
List = [1,2,3,4,5,6,7,8,9] List [1, 2, 3, 4, 5, 6, 7, 8, 9] random.shuffle(List) List [6, 7, 1, 9, 5, 8, 3, 2, 4]
Вероятностные распределения¶
random.triangular(low, high, mode) — случайное число с плавающей точкой, low ≤ N ≤ high . Mode — распределение.
random.betavariate(alpha, beta) — бета-распределение. alpha>0 , beta>0 . Возвращает от 0 до 1.
random.expovariate(lambd) — экспоненциальное распределение. lambd равен 1/среднее желаемое. Lambd должен быть отличным от нуля. Возвращаемые значения от 0 до плюс бесконечности, если lambd положительно, и от минус бесконечности до 0, если lambd отрицательный.
random.gammavariate(alpha, beta) — гамма-распределение. Условия на параметры alpha>0 и beta>0 .
random.gauss(значение, стандартное отклонение) — распределение Гаусса.
random.lognormvariate(mu, sigma) — логарифм нормального распределения. Если взять натуральный логарифм этого распределения, то вы получите нормальное распределение со средним mu и стандартным отклонением sigma . mu может иметь любое значение, и sigma должна быть больше нуля.
random.normalvariate(mu, sigma) — нормальное распределение. mu — среднее значение, sigma — стандартное отклонение.
random.vonmisesvariate(mu, kappa) — mu — средний угол, выраженный в радианах от 0 до 2π, и kappa — параметр концентрации, который должен быть больше или равен нулю. Если каппа равна нулю, это распределение сводится к случайному углу в диапазоне от 0 до 2π.
random.paretovariate(alpha) — распределение Парето.
random.weibullvariate(alpha, beta) — распределение Вейбулла.
Примеры¶
Генерация произвольного пароля¶
Хороший пароль должен быть произвольным и состоять минимум из 6 символов, в нём должны быть цифры, строчные и прописные буквы. Приготовить такой пароль можно по следующему рецепту:
import random # Щепотка цифр str1 = '123456789' # Щепотка строчных букв str2 = 'qwertyuiopasdfghjklzxcvbnm' # Щепотка прописных букв. Готовится преобразованием str2 в верхний регистр. str3 = str2.upper() print(str3) # Выведет: 'QWERTYUIOPASDFGHJKLZXCVBNM' # Соединяем все строки в одну str4 = str1+str2+str3 print(str4) # Выведет: '123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM' # Преобразуем получившуюся строку в список ls = list(str4) # Тщательно перемешиваем список random.shuffle(ls) # Извлекаем из списка 12 произвольных значений psw = ''.join([random.choice(ls) for x in range(12)]) # Пароль готов print(psw) # Выведет: '1t9G4YPsQ5L7'
Этот же скрипт можно записать всего в две строки:
import random print(''.join([random.choice(list('123456789qwertyuiopasdfghjklzxc vbnmQWERTYUIOPASDFGHJKLZXCVBNM')) for x in range(12)]))
Данная команда является краткой записью цикла for, вместо неё можно было написать так:
import random psw = '' # предварительно создаем переменную psw for x in range(12): psw = psw + random.choice(list('123456789qwertyuiopasdfgh jklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM')) print(psw) # Выведет: Ci7nU6343YGZ
Данный цикл повторяется 12 раз и на каждом круге добавляет к строке psw произвольно выбранный элемент из списка.
Ссылки¶
Модуль random. Часть 1
Библиотека Numpy предоставляет широкие возможности по работе со случайными числами. Для этого в ней предусмотрен модуль random.
Модуль random — это модуль, который позволяет генерировать псевдослучайные числа и таким образом имитировать случайные события.
При этом прежде чем перейти к изучению кода, давайте познакомимся с некоторыми ключевыми понятиями теории вероятностей.
- Случайная величина
- Вероятность случайной величины
- Классическая (теоретическая) вероятность
- Относительная (эмпирическая) вероятность
- Закон больших чисел
- Подбрасывание монеты
- Бросание игральной кости
- Метод Монте-Карло
- Шаг 1. Метод Монте-Карло
- Шаг 2. Напишем код для проведения испытаний
- Шаг 3. Рассчитаем долю успешных испытаний
- Шаг 4. Проведем полноценные испытания алгоритма
- Шаг 5. Оценим результат визуально
- Пример векторизованного кода
- Аналитическое решение
- Моделирование с помощью модуля random
- Парадокс двух конвертов
- Случайное блуждание по числовой прямой
- Доедем ли мы из Москвы до Санкт-Петербурга
- Функция случайного блуждания
- Создание одного случайного блуждания
- Моделирование нескольких случайных блужданий
- Вероятность преодоления пути
Случайная величина
Случайная величина (random variable) — это величина, которая в зависимости от случая может принимать определенное значение с заданной вероятностью. Разберем это определение более подробно и параллельно введем несколько новых терминов.
Предположим, что у нас есть некоторое событие (event), например, выпадение двойки или тройки на игральной кости. Это событие случайно (random process), если его невозможно предугадать. Тогда испытанием (trial) мы назовем бросание игральной кости, а исходом (outcome) испытания — выпавшее число.
Вероятность случайной величины
Хотя по определению случайное событие предсказать нельзя, мы можем предположить, с какой вероятностью оно произойдет. Начнем с классического или как еще говорят теоретического определения вероятности.
Классическая (теоретическая) вероятность
Пусть k — количество благоприятствующих событию A исходов (то есть исходов, которые влекут за собой наступление события A), а n — общее количество равновозможных исходов, тогда теоретической вероятностью события A будет
Разберем это определение на том же примере бросания игральной кости.
Выпадение двойки или тройки благоприятствует (приводит к наступлению) случайного события (A). Таких исходов два (либо двойка, либо тройка) и соответственно k = 2. Всего исходов шесть и вероятность их наступления одинакова (они равновозможны). Значит n = 6. Рассчитаем теоретическую вероятность такого события.
Аналогично, вероятность выпадения орла или решки на «честной» монете (fair coin) равна 1/2, а вероятность вытащить червы из колоды, в которой 36 карт, равна 9/36 или 1/4.
Вероятность любого события находится в диапазоне от 0 до 1. При этом событие с нулевой вероятностью называется невозможным, а с вероятностью равной единице — достоверным. В промежутке находятся случайные события.
Сумма вероятностей событий, образующих полную группу, всегда равна единице. Выпадение орла и выпадение решки образуют полную группу (других событий при подбрасывании монеты быть не может). Вероятность каждого из этих событий равна 1/2, сумма этих вероятностей — единице.
Относительная (эмпирическая) вероятность
Эмпирическая вероятность события — это отношение частоты наступления события А к общему числу испытаний. По большому счету, мы бросаем кости несколько раз и считаем, сколько раз выпала двойка или тройка по отношению к общему количеству бросков.
Предположим, мы бросали кость 10 раз и двойка или тройка выпали 4 раза. Рассчитаем эмпирическую вероятность такого события.
Испытаний (бросков) было проведено очень мало и эмпирическая вероятность довольно сильно отличается от теоретической. Что же будет, если кратно увеличить количество бросков?
Закон больших чисел
Закон больших чисел (Law of large numbers) утверждает, что при проведении множества испытаний эмпирическая вероятность начнет приближаться к теоретической. Другими словами, если бросать кость достаточное количество раз, то эмпирическая вероятность выпадения двойки или тройки приблизится к 1/3.
Модуль random библиотеки Numpy
Начнем изучение модуля random с нескольких практических примеров. В частности, посмотрим как можно имитировать подбрасывание монеты и бросание игральной кости, убедимся в верности Закона больших чисел с помощью метода Монте-Карло, рассмотрим задачу о двух конвертах, а также познакомимся с методом случайных блужданий.
Подбрасывание монеты
Подбрасывание монеты можно имитировать, обозначив орел и решку через 0 и 1 и случайно генерируя соответствующие числа. Для этого подойдет функция np.random.randint().
На входе функция принимает границы диапазона (верхняя граница в диапазон не входит), на выходе — генерирует целые псевдослучайные числа в его пределах.