Как использовать рандом в питоне
Random Python
Каждый человек ежедневно сталкивается со случайностью. Википедия нам говорит: случайность — это результат маловероятного или непредсказуемого события. Непредсказуемого. Стоит отметить, что, чем сложнее система, тем ниже возможность прогнозировать (предсказывать) её будущие состояния. Мир сложен и именно по-этому случайность встречается столь часто. Можно сказать, что случайностью мы называем все события, которые не можем предугадать. Таким образом, разговор о случайном – это разговор о нехватке информации. Но эту нехватку человек научился использовать себе на пользу. К примеру, случайные величина широко применяются в криптографии.
В языке Python есть удобные инструменты для работы со случайными значениями. Речь о модуле стандартной библиотеки под названием random (и не только о нём). Давайте знакомиться!
Как использовать модуль random в Python
Для начала модуль надо импортировать.
Python функции модуля random
Случайное целое число — randint() функция random
Самое частое применение данного модуля — генерация случайных чисел. Самая популярная функция для этого — randint().
Она возвращает случайное целое число, лежащее в диапазоне, указанном в параметрах функции. Оба аргумента обязательны и должны быть целыми числами.
Генерация случайного целого числа — randrange()
Функция randrange() используется для генерации случайного целого числа в пределах заданного диапазона. Отличие от randint() заключается в том, что здесь есть третий параметр – шаг, по умолчанию равный единице.
Выбор случайного элемента из списка choice()
Вы играли в детстве в «считалочки»? Эники-беники… Вот этим и занимается random.choice(): функция возвращает один случайный элемент последовательности.
Функция sample()
random.sample() применяется, когда надо выбрать несколько элементов из заданной коллекции. Она возвращает список уникальных элементов, выбранных из исходной последовательности. Количество элементов, которое вернёт функция, задаётся аргументом k.
Случайные элементы из списка — choices()
random.choices делает то же, что и random.sample(), но элементы, которые она возвращает, могут быть не уникальными.
Генератор псевдослучайных чисел — seed()
Метод seed() используется для инициализации генератора псевдослучайных чисел в Python. Вот что это означает: для генерации псевдослучайных чисел необходимо какое-то исходное число и именно это число можно установить данным методом. Если значение seed не установлено, тогда система будет отталкиваться от текущего времени.
Перемешивание данных — shuffle()
Метод random.shuffle() применяется для расстановки элементов последовательности в случайном порядке. Представьте коробку в которой лежат какие-то предметы. Встряхните её 🙂
Генерации числа с плавающей запятой — uniform()
random.uniform() похожа на randint(), но применяется для генерации числа с плавающей запятой в указанном диапазоне.
Функция triangular()
Функция random.triangular() позволяет управлять вероятностью – она возвращает случайное число с плавающей запятой, которое соответствует заданному диапазону, а также уточняющему значению mode. Этот параметр дает возможность взвешивать возможный результат ближе к одному из двух других значений параметров. По умолчанию он находится посередине диапазона.
Криптографическая зашита генератора случайных данных
Случайные числа, полученные при помощи модуля random в Питоне, не являются криптографически устойчивыми. Это означает, что криптоанализ позволяет предсказать какое число будет сгенерировано следующим. Попробуем исправить ситуацию.
Его зачастую следует использовать вместо генератора псевдослучайных чисел по умолчанию в модуле random, который предназначен для моделирования и симуляции, а не безопасности или криптографии.
Numpy.random — Генератор псевдослучайных чисел
Самый простой способ задать массив со случайными элементами — использовать функцию sample (или random, или random_sample, или ranf — это всё одна и та же функция).
Без аргументов возвращает просто число в промежутке [0, 1), с одним целым числом — одномерный массив, с кортежем — массив с размерами, указанными в кортеже (все числа — из промежутка [0, 1)).
Генерация случайного n-мерного массива вещественных чисел
numpy.random.rand()применяется для генерации массива случайных вещественных чисел в пределах заданного диапазона.
Также можно генерировать числа согласно различным распределениям (Гаусса, Парето и другие). Чаще всего нужно равномерное распределение, которое можно получить с помощь функции uniform.
Для начала необходимо установить Numpy.
Генерация случайного n-мерного массива целых чисел
С помощью функции randint или random_integers можно создать массив из целых чисел. Аргументы: low, high, size: от какого, до какого числа (randint не включает в себя это число, а random_integers включает), и size — размеры массива.
Выбор случайного элемента из массива чисел или последовательности
Функция NumPy random.choice() используется для получения случайных выборок одномерного массива, который возвращается как случайные выборки массива NumPy. Эта функция генерирует случайные выборки, которые обычно используются в статистике данных, анализе данных, полях, связанных с данными, а также может использоваться в машинном обучении, байесовской статистике и т. д.
Генерация случайных универсальных уникальных ID
Универсальные уникальные идентификаторы, также известные как UUID, — это 128-битные числа, используемые для однозначной идентификации информации в компьютерных системах. UUID могут использоваться для обозначения широкого спектра элементов, включая документы, объекты, сеансы, токены, сущности и т. Д. Их также можно использовать в качестве ключей базы данных.
Эта библиотека генерирует уникальные идентификаторы на основе системного времени и сетевого адреса компьютера. Объект UUID неизменяем и содержит некоторые функции для создания различных уникальных идентификаторов.
UUID состоит из пяти компонентов, каждый из которых имеет фиксированную длину. Символ дефиса разделяет каждый компонент. Мы можем представить UUID в формате «8-4-4-4-12», где каждая из цифр представляет длину в шестнадцатеричном формате.
UUID Python, сгенерированный с помощью функции uuid4(), создается с использованием истинно случайного или псевдослучайного генератора. Поэтому вероятность повторения двух гуидов невелика. Когда UUID необходимо сгенерировать на отдельных машинах или мы хотим сгенерировать безопасные UUID, используйте UUID4 (). Он также используется для генерации криптографически безопасных случайных чисел.
Python 3: Генерация случайных чисел (модуль random)¶
«Генерация случайных чисел слишком важна, чтобы оставлять её на волю случая»
Python порождает случайные числа на основе формулы, так что они не на самом деле случайные, а, как говорят, псевдослучайные [1]. Этот способ удобен для большинства приложений (кроме онлайновых казино) [2].
[1] | Википедия: Генератор псевдослучайных чисел |
[2] | Доусон М. Программируем на Python. — СПб.: Питер, 2014. — 416 с.: ил. — 3-е изд |
Модуль random позволяет генерировать случайные числа. Прежде чем использовать модуль, необходимо подключить его с помощью инструкции:
random.random¶
random.random() — возвращает псевдослучайное число от 0.0 до 1.0
random.seed¶
random.seed( ) — настраивает генератор случайных чисел на новую последовательность. По умолчанию используется системное время. Если значение параметра будет одиноким, то генерируется одинокое число:
random.uniform¶
random.randint¶
random.choince¶
random.choince( ) — возвращает случайный элемент из любой последовательности (строки, списка, кортежа):
random.randrange¶
random.shuffle¶
random.shuffle( ) — перемешивает последовательность (изменяется сама последовательность). Поэтому функция не работает для неизменяемых объектов.
Вероятностные распределения¶
random.expovariate(lambd) — экспоненциальное распределение. lambd равен 1/среднее желаемое. Lambd должен быть отличным от нуля. Возвращаемые значения от 0 до плюс бесконечности, если lambd положительно, и от минус бесконечности до 0, если lambd отрицательный.
random.gauss(значение, стандартное отклонение) — распределение Гаусса.
random.normalvariate(mu, sigma) — нормальное распределение. mu — среднее значение, sigma — стандартное отклонение.
random.vonmisesvariate(mu, kappa) — mu — средний угол, выраженный в радианах от 0 до 2π, и kappa — параметр концентрации, который должен быть больше или равен нулю. Если каппа равна нулю, это распределение сводится к случайному углу в диапазоне от 0 до 2π.
random.paretovariate(alpha) — распределение Парето.
random.weibullvariate(alpha, beta) — распределение Вейбулла.
Примеры¶
Генерация произвольного пароля¶
Хороший пароль должен быть произвольным и состоять минимум из 6 символов, в нём должны быть цифры, строчные и прописные буквы. Приготовить такой пароль можно по следующему рецепту:
Этот же скрипт можно записать всего в две строки:
Данная команда является краткой записью цикла for, вместо неё можно было написать так:
Данный цикл повторяется 12 раз и на каждом круге добавляет к строке psw произвольно выбранный элемент из списка.
Рандом (random) в Python — как генерировать случайные числа
С лучайные числа применяются в программировании в разных случаях, например, для моделирования процессов и в видеоиграх. Для начала разберёмся, какую последовательность можно назвать случайной.
Случайной последовательностью называют набор элементов, полученных таким образом, что любой элемент их этого набора никак не связан ни с каким другим элементом. При этом в программировании обычно последовательность не является строго случайной — в ней для генерации следующего элемента используется предыдущий.
Как работают случайные числа
Полностью случайные числа генерируются истинным генератором случайных чисел (TRNG). Их можно получить, например, бросанием кубика или доставанием шаров из урны. Так как подобных устройств нет в компьютере, то в нем можно получить только «псевдослучайные» числа.
В Python, как и во всех остальных языках программирования, используется генератор псевдослучайных чисел, который выдает как будто случайные, но воспроизводимые числа.
Чтобы понять, как работают генераторы псевдослучайных чисел, рассмотрим работу одного из первых подобных генераторов. Его алгоритм работы был разработан Нейманом. В нем первое число возводят в квадрат, а потом из полученного результата берут средние цифры. Например, первое число 281, возводим его в квадрат, получаем 78961 и берем три цифры, находящиеся в середине – 896. После этого для генерации следующего числа используем 896.
Модуль random
👉 Как использовать: чтобы начать использовать встроенные генераторы случайных чисел, нужно сначала подключить модуль рандом:
После этого можно вызывать методы модуля random :
В модуле random существуют методы для генерации целых чисел, с плавающей точкой, для работы с последовательностями. Кроме этого существуют функции для управления генератором и генерации различных последовательностей. Рассмотрим основные из этих методов.
Случайные целые числа (int)
Перечислим основные функции, которые есть в модуле random для выдачи случайных целых чисел.
randint Функция randint(a, b) получает на вход два целых числа и возвращает случайное значение из диапазона [a, b] (a и b входят в этот диапазон).
import random random_number = random.randint(0, 125) print(random_number) > 113
randrange В функцию randrange(start, stop[, step]) передают три целых числа:
На выходе функция выдает случайное число в заданном диапазоне.
import random random_number = random.randrange(1, 100, 2) print(random_number) > 43
Случайные вещественные числа (float)
Перечислим функции, которые выдают вещественные числа.
random Функция random() выдает вещественные числа, в диапазоне [0.0, 1.0) (включая 0.0, но не включая 1.0).
import random random_number = random.uniform(7.3, 10.5) print(random_number) > 10.320165816501492
Случайные элементы из последовательности
В модуле random языка Python есть несколько функций, которые можно применять для работы с последовательностями.
choice С помощью функции choice(seq) можно выбрать один элемент из набора данных. В качестве единственного аргумента в функцию передаётся последовательность. Если последовательность будет пустой (то есть в ней не будет ни одного элемента), получим ошибку «IndexError».
import random seq = [10, 11, 12, 13, 14, 15] random_element = random.choice(seq) print(random_element) > 12
import random seq = [«Cappuccino», «Latte», «Espresso», «Americano»] random.shuffle(seq) print(seq) > [‘Espresso’, ‘Americano’, ‘Latte’, ‘Cappuccino’]
На выходе получаем k уникальных случайных элементов из последовательности.
Если в исходной последовательности есть неуникальные (повторяющиеся) элементы, то каждый их них может появиться в новом списке.
Управление генератором
Генерация чисел в Python не совсем случайна и зависит от состояния генератора случайных чисел. Рассмотрим функции, с помощью которых можно управлять состоянием этого генератора.
getstate Метод getstate() модуля random возвращает объект, в котором записано текущим состояние генератора случайных чисел. Его можно использовать для восстановления состояния генератора. Эта функция не имеет параметров.
import random state = random.getstate() # сохраняем текущее состояние генератора random_number_1 = random.random() # получаем случайное число print(random_number_1) # > 0.42164837822065193 # первое случайное число random_number_2 = random.random() print(random_number_2) # > 0.2486825504535808 # второе случайное число random.setstate(state) # восстанавливаем состояние генератора random_number_3 = random.random() # снова генерируем число print(random_number_3) # > 0.42164837822065193 # новое число равное первому, сгенерированному с тем же состояние генератора
seed Генератору случайных чисел нужно число, основываясь на котором он сможет начать генерировать случайные значения.
Вероятностное распределение
В теории вероятностей важную роль играет понятие распределение вероятностей. Оно показывает с какой вероятность может наступить каждое из возможных событий. С его помощью можно моделировать как наступление дискретных событий (например, бросание монеты, количество телефонных разговоров за неделю, количество пассажиров в автобусе), так и непрерывных (например, длительность разговора, количество осадков за год, расход электричества за месяц).
Для наглядности рассмотрим самое распространенное нормальное распределение вероятностей. На рисунке ниже приведена кривая нормального распределения.
В модуле random существуют функции, которые позволяют использовать различные методы вероятностных распределений:
Best practices
Приведем несколько примеров использования случайных чисел.
Пример #1 — случайная задержка (random sleep)
Иногда необходимо сделать так, чтобы программа работала с задержками. Например, это актуально при парсинге сайта (при частых запросах некоторые сайты могут вас банить).
import random import time page_list = [«site.ru/page1», «site.ru/page2», «site.ru/page3»] for page in page_list: # # some actions # time.sleep(random.randint(1, 3)) # задержка от 1 до 3 секунд
💭 Для имитации действий человека можно использовать random.uniform(1, 3) — это добавит случайные миллисекунды к вашим задержкам.
Пример #2 — выбор случайного элемента из списка (с учетом веса)
Дано: веб-сайт. В базе данных 4 баннера, к каждому баннеру указан вес (приоритет к показу).
Необходимо рандомно показывать на сайте 1 баннер, в зависимости от его веса.
Пример #3 — случайный пароль
С помощью генератора случайных чисел можно создавать пароли. Например, сгенерировать стойкий пароль можно так:
import random import string pwd_length = 0 while pwd_length Укажите длину пароля (от 12 символов): 12 > JFyc;6-ICxuQ
В данном примере будет сгенерирован пароль, содержащий минимум 12 символов, среди которых точно будет маленькая буква, большая буква, цифра и символ.
Методы модуля random позволяют получить случайные данные с использованием Mersenne Twister. Однако имейте в виду, что данный способ не является криптографически безопасным (для генерирования паролей есть более надежные варианты).
Модуль random: генерация псевдослучайных чисел в Python
Многим компьютерным приложениям необходимо генерировать случайные числа. Однако ни одно из них не генерирует действительно случайное число. Python, как и многие другие языки программирования, использует генератор псевдослучайных чисел. Генерация случайных чисел в Python основана на алгоритме Вихрь Мерсенна. Этот метод быстрый и потокобезопасный, но не подходит для криптографических целей.
random.getstate() — эта функция вместе с функцией setstate() помогает воспроизводить одни и те же случайные данные снова и снова. Функция getstate() возвращает внутреннее состояние генератора случайных чисел. Больше информации вы можете найти по ссылке.
random.setstate(state) — эта функция восстанавливает внутреннее состояние генератора.
Следующие функции предназначены для генерации случайных целых чисел:
random.randrange() − эта функция генерирует случайное целое число в пределах заданного диапазона чисел. Может принимать три параметра.
Параметры start и step являются необязательными. Их значения по умолчанию равны 0 и 1 соответственно. Шаг ( step ) определяет интервал между последовательными числами.
Примечание: помните, что выходные данные примеров в этой статье могут не совпадать, так как они генерируются случайным образом.
Следующие функции работают со случайными числами с плавающей запятой:
random.random() — эта функция генерирует случайное число с плавающей запятой в диапазоне от 0.0 до 1.0.
Следующие функции работают c последовательностями, а именно — со строками, списками или кортежами:
random.choices() − эта функция случайным образом выбирает несколько элементов из списка. Первый параметр этой функции — последовательность, а второй — количество элементов, которые нужно вернуть. Возвращает список, в котором может повторяться несколько раз один и тот же элемент.
random.shuffle() — эта функция переупорядочивает (перемешивает) элементы в изменяемой (mutable) последовательности и размещает их случайным образом.
random.sample(sequence, n) — эта функция возвращает список случайно выбранных элементов из последовательности. Результирующий список содержит только уникальные элементы.
Более подробную информацию о функциях модуля random вы можете найти в документации.
«Случайные» числа в Python – random, randint и randrange
В компьютерных программах нередко требуется эмуляция случайности. Например, при разработке игр. Если в программе имеется некий генератор, то есть производитель, случайного числа, то, используя полученное таким образом число, можно выбирать ту или иную ветку выполнения программы, или произвольный объект из коллекции. Другими словами, главное – сгенерировать число. Эмуляция случайности иного рода основывается на нем.
Мы наверняка не знаем, есть ли в природе случайность, или она нам только кажется из-за ограниченности наших знаний. Мы только знаем, что в программировании настоящей случайности нет. Неоткуда взяться произвольному числу, нельзя запрограммировать его появление из ниоткуда. Можно лишь создать программу, которая в результате применения сложной формулы к «зерну» будет выдавать число, и нам будет казаться, что это число случайно.
«Зерно» – это исходные данные для формулы. Им может быть, например, системное время в миллисекундах, которое постоянно меняется. Следовательно, «зерно» будет постоянно разным. Или программист может задавать его самостоятельно.
Чтобы обращаться к функциям, надо импортировать модуль random :
Или импортировать отдельные функции из него:
Функции для получения целых «случайных» чисел – randint() и randrange()
Функции randint() и randrange() генерируют псевдослучайные целые числа. Первая из них наиболее простая и всегда принимает только два аргумента – пределы целочисленного диапазона, из которого выбирается любое число:
или (если импортировались отдельные функции):
В случае randint() обе границы включаются в диапазон, т. е. на языке математики отрезок описывается как [a; b].
Числа могут быть отрицательными:
Но первое число всегда должно быть меньше или, по-крайней мере, равно второму. То есть a randrange() сложнее. Она может принимать один аргумент, два или даже три. Если указан только один, то она возвращает случайное число от 0 до указанного аргумента. Причем сам аргумент в диапазон не входит. На языке математики – это [0; a).
Если в randrange() передается два аргумента, то она работает аналогично randint() за одним исключением. Верхняя граница не входит в диапазон, т. е. [a; b).
Здесь результатом второго вызова всегда будет число 1.
Функция random() – «случайные» вещественные числа
Чтобы получить случайное вещественное число, или, как говорят, число с плавающей точкой, следует использовать функцию random() из одноименного модуля random языка Python. Она не принимает никаких аргументов и возвращает число от 0 до 1, не включая 1:
Результат содержит много знаков после запятой. Чтобы его округлить, можно воспользоваться встроенной в Python функцией round() :
Чтобы получать случайные вещественные числа в иных пределах, отличных от [0; 1), прибегают к математическим приемам. Так если умножить полученное из random() число на любое целое, то получится вещественное в диапазоне от 0 до этого целого, не включая его:
Если нижняя граница должна быть отличной от нуля, то число из random() надо умножать на разницу между верхней и нижней границами, после чего прибавить нижнюю:
В данном примере число умножается на 6. В результате получается число от 0 до 6. Прибавив 4, получаем число от 4 до 10.
Практическая работа
Используя функцию randrange() получите псевдослучайное четное число в пределах от 6 до 12. Также получите число кратное пяти в пределах от 5 до 100.
Напишите программу, которая запрашивает у пользователя границы диапазона и какое (целое или вещественное) число он хочет получить. Выводит на экран подходящее случайное число.
Примеры решения и дополнительные уроки в android-приложении и pdf-версии курса