Каждый человек ежедневно сталкивается со случайностью. Википедия нам говорит: случайность — это результат маловероятного или непредсказуемого события. Непредсказуемого. Стоит отметить, что, чем сложнее система, тем ниже возможность прогнозировать (предсказывать) её будущие состояния. Мир сложен и именно по-этому случайность встречается столь часто. Можно сказать, что случайностью мы называем все события, которые не можем предугадать. Таким образом, разговор о случайном – это разговор о нехватке информации. Но эту нехватку человек научился использовать себе на пользу. К примеру, случайные величина широко применяются в криптографии.
В языке Python есть удобные инструменты для работы со случайными значениями. Речь о модуле стандартной библиотеки под названием random (и не только о нём). Давайте знакомиться!
- Как использовать модуль random в Python
- Python функции модуля random
- Случайное целое число — randint()функция random
- Генерация случайного целого числа — randrange()
- Выбор случайного элемента из списка choice()
- Функция sample()
- Случайные элементы из списка — choices()
- Генератор псевдослучайных чисел — seed()
- Перемешивание данных — shuffle()
- Генерации числа с плавающей запятой —uniform()
- Функция triangular()
- Криптографическая зашита генератора случайных данных
- Numpy.random — Генератор псевдослучайных чисел
- Генерация случайного n-мерного массива вещественных чисел
- Генерация случайного n-мерного массива целых чисел
- Выбор случайного элемента из массива чисел или последовательности
- Генерация случайных универсальных уникальных ID
Как использовать модуль random в Python
Для начала модуль надо импортировать.
import random
Этот модуль содержит функции для работы со случайным числом.
import random
print(random.random())
# Вывод: 0.22721918183118728
Вот и наше первое случайное число.
Python функции модуля random
Случайное целое число — randint() функция random
Самое частое применение данного модуля — генерация случайных чисел. Самая популярная функция для этого — randint().
Она возвращает случайное целое число, лежащее в диапазоне, указанном в параметрах функции. Оба аргумента обязательны и должны быть целыми числами.
import random
print('Случайное целое число:', end=' ')
print(random.randint(0, 10))
# Вывод:
Случайное целое число: 10
Генерация случайного целого числа — randrange()
Функция randrange() используется для генерации случайного целого числа в пределах заданного диапазона. Отличие от randint() заключается в том, что здесь есть третий параметр – шаг, по умолчанию равный единице.
import random
print('Случайное целое число:', end=' ')
print(random.randrange(0, 10, 2)) # только чётные числа
# Вывод:
Случайное целое число: 4
Выбор случайного элемента из списка choice()
Вы играли в детстве в «считалочки»? Эники-беники… Вот этим и занимается random.choice(): функция возвращает один случайный элемент последовательности.
import random
print(list('abracadabra'))
print(random.choice(list('abracadabra')))
# Вывод:
['a', 'b', 'r', 'a', 'c', 'a', 'd', 'a', 'b', 'r', 'a']
r
Функция sample()
random.sample() применяется, когда надо выбрать несколько элементов из заданной коллекции. Она возвращает список уникальных элементов, выбранных из исходной последовательности. Количество элементов, которое вернёт функция, задаётся аргументом k.
import random
example = list('abracadabra')
print(example)
print(random.sample(example, 5))
# Вывод:
['a', 'b', 'r', 'a', 'c', 'a', 'd', 'a', 'b', 'r', 'a']
['d', 'r', 'b', 'a', 'c']
Случайные элементы из списка — choices()
random.choices делает то же, что и random.sample(), но элементы, которые она возвращает, могут быть не уникальными.
import random
example = list('abracadabra')
print(example)
print(random.choices(example, k=15))
# Вывод:
['a', 'b', 'r', 'a', 'c', 'a', 'd', 'a', 'b', 'r', 'a']
['d', 'a', 'd', 'a', 'r', 'b', 'r', 'a', 'd', 'b', 'a', 'r', 'd', 'a', 'a']
Генератор псевдослучайных чисел — seed()
Метод seed() используется для инициализации генератора псевдослучайных чисел в Python. Вот что это означает: для генерации псевдослучайных чисел необходимо какое-то исходное число и именно это число можно установить данным методом. Если значение seed не установлено, тогда система будет отталкиваться от текущего времени.
import random
random.seed(5)
print(random.random())
print(random.random())
print(random.random())
random.seed(5)
print(random.random())
print(random.random())
print(random.random())
# Вывод:
0.6229016948897019
0.7417869892607294
0.7951935655656966
0.6229016948897019
0.7417869892607294
0.7951935655656966
Перемешивание данных — shuffle()
Метод random.shuffle() применяется для расстановки элементов последовательности в случайном порядке. Представьте коробку в которой лежат какие-то предметы. Встряхните её 🙂
import random
example = list('abracadabra')
print(example)
random.shuffle(example)
print(example)
# Вывод:
['a', 'b', 'r', 'a', 'c', 'a', 'd', 'a', 'b', 'r', 'a']
['d', 'r', 'b', 'b', 'a', 'r', 'a', 'a', 'a', 'a', 'c']
Генерации числа с плавающей запятой — uniform()
random.uniform() похожа на randint(), но применяется для генерации числа с плавающей запятой в указанном диапазоне.
import random
print(random.uniform(2.57, 3.8))
print(random.uniform(20.57, 30.8))
# Вывод:
3.307398107170489
28.91020719832224
Функция triangular()
Функция random.triangular() позволяет управлять вероятностью – она возвращает случайное число с плавающей запятой, которое соответствует заданному диапазону, а также уточняющему значению mode. Этот параметр дает возможность взвешивать возможный результат ближе к одному из двух других значений параметров. По умолчанию он находится посередине диапазона.
import random
print(random.triangular(2.57, 3.8, 0.1))
print(random.triangular(2.57, 3.8, 0.000001))
print(random.triangular(2.57, 3.8, 100000))
# Вывод:
2.754036943795768
2.0948646011589727
186.20353644235672
Криптографическая зашита генератора случайных данных
Случайные числа, полученные при помощи модуля random в Питоне, не являются криптографически устойчивыми. Это означает, что криптоанализ позволяет предсказать какое число будет сгенерировано следующим. Попробуем исправить ситуацию.
Модуль secrets используется для генерации криптографически сильных случайных чисел, пригодных для управления данными , такими как пароли, аутентификации учетной записи, маркеры безопасности и так далее.
Его зачастую следует использовать вместо генератора псевдослучайных чисел по умолчанию в модуле random, который предназначен для моделирования и симуляции, а не безопасности или криптографии.
import secrets
secretsGenerator = secrets.SystemRandom()
random_number = secretsGenerator.randint(0, 50)
print(random_number)
random_number2 = secretsGenerator.randrange(4, 40, 4)
print(random_number2)
number_list = [6, 12, 18, 24, 30, 36, 42, 48, 54, 60]
secure_choice = secretsGenerator.choice(number_list)
print(secure_choice)
secure_sample = secretsGenerator.sample(number_list, 3)
print(secure_sample)
secure_float = secretsGenerator.uniform(2.5, 25.5)
print(secure_float)
# Вывод:
3
4
48
[48, 42, 24]
16.43293639196964
Numpy.random — Генератор псевдослучайных чисел
Самый простой способ задать массив со случайными элементами — использовать функцию sample (или random, или random_sample, или ranf — это всё одна и та же функция).
Без аргументов возвращает просто число в промежутке [0, 1), с одним целым числом — одномерный массив, с кортежем — массив с размерами, указанными в кортеже (все числа — из промежутка [0, 1)).
Генерация случайного n-мерного массива вещественных чисел
numpy.random.rand()применяется для генерации массива случайных вещественных чисел в пределах заданного диапазона.
Также можно генерировать числа согласно различным распределениям (Гаусса, Парето и другие). Чаще всего нужно равномерное распределение, которое можно получить с помощь функции uniform.
Для начала необходимо установить Numpy.
pip install numpy
import numpy
random_float_array = numpy.random.rand(2, 2)
print("2 X 2 массив случайных вещественных чисел в [0.0, 1.0] \n", random_float_array, "\n")
random_float_array = numpy.random.uniform(25.5, 99.5, size=(3, 2))
print("3 X 2 массив случайных вещественных чисел в [25.5, 99.5] \n", random_float_array, "\n")
# Вывод:
2 X 2 массив случайных вещественных чисел в [0.0, 1.0]
[[0.65381466 0.94942677]
[0.48291731 0.1857905 ]]
3 X 2 массив случайных вещественных чисел в [25.5, 99.5]
[[28.61664036 69.09697835]
[62.59002522 73.23196535]
[85.79502493 47.36728352]]
Генерация случайного n-мерного массива целых чисел
С помощью функции randint или random_integers можно создать массив из целых чисел. Аргументы: low, high, size: от какого, до какого числа (randint не включает в себя это число, а random_integers включает), и size — размеры массива.
import numpy
random_integer_array = numpy.random.random_integers(1, 10, 5)
print("1-мерный массив случайных целых чисел \n", random_integer_array,"\n")
random_integer_array = numpy.random.random_integers(1, 10, size=(3, 2))
print("2-мерный массив случайных целых чисел \n", random_integer_array)
# Вывод:
1-мерный массив случайных целых чисел
[ 4 10 1 10 5]
2-мерный массив случайных целых чисел
[[ 7 4]
[ 9 7]
[ 6 10]]
Но здесь мы получим предупреждение о том, что функция устарела:
DeprecationWarning: This function is deprecated. Please call randint(1, 10 + 1) instead
random_integer_array = numpy.random.random_integers(1, 10, 5)
Выбор случайного элемента из массива чисел или последовательности
Функция NumPy random.choice() используется для получения случайных выборок одномерного массива, который возвращается как случайные выборки массива NumPy. Эта функция генерирует случайные выборки, которые обычно используются в статистике данных, анализе данных, полях, связанных с данными, а также может использоваться в машинном обучении, байесовской статистике и т. д.
import numpy
array =[10, 20, 30, 40, 50, 20, 40]
single_random_choice = numpy.random.choice(array, size=1)
print("один случайный выбор из массива 1-D", single_random_choice)
multiple_random_choice = numpy.random.choice(array, size=3, replace=False)
print("несколько случайных выборов из массива 1-D без замены", multiple_random_choice)
multiple_random_choice = numpy.random.choice(array, size=3, replace=True)
print("несколько случайных выборов из массива 1-D с заменой", multiple_random_choice)
# Вывод:
один случайный выбор из массива 1-D [10]
несколько случайных выборов из массива 1-D без замены [40 20 40]
несколько случайных выборов из массива 1-D с заменой [30 20 20]
Генерация случайных универсальных уникальных ID
Универсальные уникальные идентификаторы, также известные как UUID, — это 128-битные числа, используемые для однозначной идентификации информации в компьютерных системах. UUID могут использоваться для обозначения широкого спектра элементов, включая документы, объекты, сеансы, токены, сущности и т. Д. Их также можно использовать в качестве ключей базы данных.
Эта библиотека генерирует уникальные идентификаторы на основе системного времени и сетевого адреса компьютера. Объект UUID неизменяем и содержит некоторые функции для создания различных уникальных идентификаторов.
UUID состоит из пяти компонентов, каждый из которых имеет фиксированную длину. Символ дефиса разделяет каждый компонент. Мы можем представить UUID в формате «8-4-4-4-12», где каждая из цифр представляет длину в шестнадцатеричном формате.
UUID Python, сгенерированный с помощью функции uuid4(), создается с использованием истинно случайного или псевдослучайного генератора. Поэтому вероятность повторения двух гуидов невелика. Когда UUID необходимо сгенерировать на отдельных машинах или мы хотим сгенерировать безопасные UUID, используйте UUID4 (). Он также используется для генерации криптографически безопасных случайных чисел.
import uuid
# получить уникальный UUID
safeId = uuid.uuid4()
print("безопасный уникальный id ", safeId)
# Вывод:
безопасный уникальный id 61f2682f-4cbf-4c1d-a571-d2094052f371