Рубрики
Без рубрики

Введение в модуль Python Random

Автор оригинала: Mateusz Dobrychlop.

Введение в модуль Python Random

Вступление

Даже для тех, кто не интересуется компьютерным программированием, полезность генерации случайных чисел в определенных обстоятельствах является чем-то очевидным. В большинстве настольных игр мы бросаем кости, чтобы сгенерировать непредсказуемое число, которое определяет следующий ход игрока. Кроме того, мы все можем согласиться с тем, что играть в любую карточную игру было бы бессмысленно без правильной перетасовки между раундами.

Но случайные числа важны не только в относительно тривиальных областях, таких как развлечения или азартные игры. Они особенно важны в области криптографии. Чтобы обеспечить безопасную передачу данных, каждый раз, когда требуется безопасное соединение, необходимо генерировать случайный ключ. Многие различные виды электронных коммуникаций используют этот вид безопасности. Очень важно, чтобы ключ было трудно угадать – лучший способ убедиться в этом – сделать его случайным, поскольку в тот момент, когда кто-то угадывает ключ, он может расшифровать сообщение-и связь больше не является безопасной.

Истинная случайность против псевдослучайности

Случайные числа могут быть получены в результате применения методов, называемых генераторами случайных чисел (ГСЧ), которые можно разделить на две категории: истинные генераторы случайных чисел (ТРНГ- также называемые аппаратными генераторами случайных чисел) и генераторы псевдослучайных чисел (ПРНГ).

Истинные Генераторы случайных чисел

Истинные генераторы случайных чисел-это методы, которые выводят случайность или непредсказуемость из непредсказуемых аспектов физических процессов. Эти методы непосредственно не производят числа, а скорее состояния, которые затем могут быть интерпретированы как числа – вот почему их обычно называют генераторами случайных событий ( REG s). Некоторые из них, которые используют макроскопические события, широко известны – такие методы, как бросание костей, подбрасывание монет или перетасовка карт.

Эти истинные генераторы случайных чисел часто используют более сложные физические явления. Некоторые из них, такие как радиоактивный распад, тепловой шум или радиошум, выводят свою непредсказуемость из особенностей квантовой механики. Другие методы используют непредсказуемость атмосферного шума или даже поведения лавовых ламп .

Генераторы псевдослучайных чисел

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

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

Python Случайный Модуль

Python, очевидно предлагает супер простой в использовании инструментарий для обработки случайных чисел. Модуль, по какой-то причине называемый random , реализует генератор псевдослучайных чисел и содержит методы, которые позволяют нам непосредственно решать множество различных задач программирования, где случайность вступает в игру.

Модуль random основан на Marsenne Twister – очень популярном алгоритме, который по умолчанию является генератором псевдослучайных чисел не только для Python, но и для многих других популярных программных систем, таких как Microsoft Excel, MATLAB, R или PHP. Его важные преимущества включают разрешительное лицензирование, случайное сходство, подтвержденное многими статистическими тестами, и относительно высокую скорость по сравнению с другими PRNGS.

Метод random()

Наиболее важным методом модуля random является метод random () . Большинство других функций зависят от него. Метод random() генерирует случайный поплавок в диапазоне (0.0, 1.0).

>>> import random
>>> random.random()
0.8474337369372327

Метод seed()

Если мы не задаем начальное значение для генерации псевдослучайных чисел, то начальным значением по умолчанию будет текущее системное время. Однако мы можем установить точное значение семени вручную, что очень удобно, особенно если мы хотим воспроизвести наши псевдослучайные результаты в будущем. Для этой цели мы можем использовать метод random.seed () .

>>> random.seed(5)
>>> random.random()
0.6229016948897019
>>> random.random()
0.7417869892607294
>>> random.random()
0.7951935655656966
>>> random.seed(5)
>>> random.random()
0.6229016948897019

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

Это позволяет Python каждый раз придумывать новые числа. Но все же, после сброса семени с помощью метода random.seed () , мы можем воспроизвести точно такую же последовательность псевдослучайных чисел в любое время. Это очень полезно для таких вещей, как запуск тестов. Если вы даете одно и то же семя каждый раз, когда запускаете тест, использующий один из методов random , то вы все равно сможете узнать, каким должен быть результат тестов.

Другие примеры случайного модуля

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

>>> random.randint(1,10)
4

Метод random.randint() принимает два аргумента, описывающих диапазон, из которого метод извлекает случайное целое число.

>>> random.randrange(2,10,2)
2
>>> random.randrange(2,10,2)
4
>>> random.randrange(2,10,2)
8
>>> random.randrange(2,10,2)
6

В приведенном выше сценарии метод random.randrange() аналогичен методу random.randint () , но он также позволяет нам определить третий аргумент, который является точкой шага определенного диапазона. В приведенном выше примере нам нужны только четные числа из диапазона от 2 до 10.

>>> cards = ['ace_spades','10_hearts','3_diamonds','king_hearts']
>>> random.choice(cards)
'10_hearts'

В приведенном выше скрипте метод random.choice() выбирает случайный элемент из списка.

>>> cards = ['ace_spades','10_hearts','3_diamonds','king_hearts']
>>> random.shuffle(cards)
>>> print(cards)
['king_hearts', '3_diamonds', 'ace_spades', '10_hearts']

В предыдущем скрипте метод random.shuffle() перетасовывает список элементов. Важно отметить, что он изменяет список на месте-это означает, что он возвращает None и фактически изменяет нашу переменную cards .

Выводы

Получение хороших случайных чисел для серьезных приложений, таких как криптография, является непростой задачей. Но когда для нашего приложения достаточно твердого псевдослучайного числа, Python, как всегда, предлагает ряд супер простых способов быстро достичь нашей цели.