Генератор случайных чисел
Случайные и последовательности: случайный выбор, выбор и выборка
import random
shuffle()
Вы можете использовать random.shuffle() , чтобы смешать / рандомизации элементы в изменяемом и индексируемой последовательности. Например, list :
laughs = ["Hi", "Ho", "He"] random.shuffle(laughs) # Shuffles in-place! Don't do: laughs = random.shuffle(laughs) print(laughs) # Out: ["He", "Hi", "Ho"] # Output may vary!
choice()
Принимает случайный элемент из последовательности произвольном:
print(random.choice(laughs)) # Out: He # Output may vary!
sample()
Как choice он принимает случайные элементы из последовательности , но произвольной вы можете указать , сколько:
# |--sequence--|--number--| print(random.sample( laughs , 1 )) # Take one element # Out: ['Ho'] # Output may vary!
он не будет принимать один и тот же элемент дважды:
print(random.sample(laughs, 3)) # Take 3 random element from the sequence. # Out: ['Ho', 'He', 'Hi'] # Output may vary! print(random.sample(laughs, 4)) # Take 4 random element from the 3-item sequence.
ValueError: выборка больше, чем совокупность
Создание случайных целых чисел и чисел: randint, randrange, random и равномерное
import random
randint ()
Возвращает случайное число между x и y (включительно):
random.randint(x, y)
Например получать случайное число между 1 и 8 :
random.randint(1, 8) # Out: 8
randrange ()
random.randrange имеет тот же синтаксис, что range и в отличие от random.randint , последнее значение не включено:
random.randrange(100) # Random integer between 0 and 99 random.randrange(20, 50) # Random integer between 20 and 49 random.rangrange(10, 20, 3) # Random integer between 10 and 19 with step 3 (10, 13, 16 and 19)
random()
Возвращает случайное число с плавающей запятой от 0 до 1:
random.random() # Out: 0.66486093215306317
uniform
Возвращает случайное число с плавающей точкой между x и y (включительно):
random.uniform(1, 8) # Out: 3.726062641730108
Воспроизводимые случайные числа: семя (seed) и состояние (state)
Установка определенного Seed создаст фиксированный ряд случайных чисел:
random.seed(5) # Create a fixed state print(random.randrange(0, 10)) # Get a random integer between 0 and 9 # Out: 9 print(random.randrange(0, 10)) # Out: 4
Сброс начального числа создаст ту же самую «случайную» последовательность снова:
random.seed(5) # Reset the random module to the same fixed state. print(random.randrange(0, 10)) # Out: 9 print(random.randrange(0, 10)) # Out: 4
Так как семя фиксируется эти результаты всегда 9 и 4 .Если иметь конкретные номера не требуется , только то , что значения будут тем же, также можно просто использовать getstate и setstate для восстановления предыдущего состояния:
save_state = random.getstate() # Get the current state print(random.randrange(0, 10)) # Out: 5 print(random.randrange(0, 10)) # Out: 8 random.setstate(save_state) # Reset to saved state print(random.randrange(0, 10)) # Out: 5 print(random.randrange(0, 10)) # Out: 8
Для псевдо-рандомизации последовательности вы снова seed с None :
random.seed(None)
Или вызовите seed метод без аргументов:
random.seed()
Создание криптографически безопасных случайных чисел
По умолчанию случайный модуль Python использовать Вихрь Мерсенна PRNG для генерации случайных чисел, которые, хотя и пригодны в областях , таких как моделирование, не отвечает требованиям безопасности в более сложных условиях.
Для создания криптографически защищенного псевдослучайного числа, можно использовать SystemRandom , которые, используя os.urandom , может выступать в качестве криптографической защиты генератора псевдослучайных чисел, CPRNG .
Самый простой способ использовать это просто включает в себя инициализацию SystemRandom класса. Предоставленные методы аналогичны тем, которые экспортируются случайным модулем.
from random import SystemRandom secure_rand_gen = SystemRandom()
Для того чтобы создать случайную последовательность 10 int s в диапазоне [0, 20] , можно просто вызвать randrange() :
print([secure_rand_gen.randrange(10) for i in range(10)]) # [9, 6, 9, 2, 2, 3, 8, 0, 9, 9]
Для того, чтобы создать случайное число в заданном диапазоне, можно использовать randint :
print(secure_rand_gen.randint(0, 20)) # 5
и, соответственно, для всех других методов. Интерфейс точно такой же, единственным изменением является основной генератор чисел.
Вы можете также использовать os.urandom непосредственно для получения криптографически безопасных случайных байт.
Создание случайного пароля пользователя
Для того , чтобы создать случайный пароль пользователя , можно использовать символы , представленные в string модуле. В частности punctuation для знаков пунктуации, ascii_letters для букв и digits для цифр:
from string import punctuation, ascii_letters, digits
Затем мы можем объединить все эти символы в имени с именем symbols :
symbols = ascii_letters + digits + punctuation
Удалите любой из них, чтобы создать пул символов с меньшим количеством элементов.
После этого, мы можем использовать random.SystemRandom для генерации пароля. Для пароля длиной 10:
secure_random = random.SystemRandom() password = "".join(secure_random.choice(symbols) for i in range(10)) print(password) # '^@g;J?]M6e'
Обратите внимание , что другие процедуры , сделанные немедленно доступны в random модуле — такие , как random.choice , random.randint и т.д. — не подходит для криптографических целей.
За кулисами, эти процедуры использовать Вихрь Мерсенна ПСЧ , который не удовлетворяет требованиям , предъявляемым к CSPRNG.Таким образом, в частности, вам не следует использовать какие-либо из них для создания паролей, которые вы планируете использовать. Всегда используйте экземпляр SystemRandom , как показано выше.
Начиная с Python 3.6 доступен модуль `секреты`, который предоставляет криптографически безопасную функциональность. Процитировав [официальную документацию] [pydoc-secrets-3.6], чтобы сгенерировать * «десятибуквенный буквенно-цифровой пароль, содержащий как минимум один символ в нижнем регистре, как минимум один символ в верхнем регистре и как минимум три цифры», * вы можете: импортировать строку alphabet = string.ascii_letters + string.digits, а True: пароль = » .join (выбор (алфавит) для i в диапазоне (10)) if (любой (c.islower () для c в пароле) и любой (c. isupper () для c в пароле) и sum (c.isdigit () для c в пароле)> = 3): break
Случайное двоичное решение
import random probability = 0.3 if random.random() < probability: print("Decision with probability 0.3") else: print("Decision with probability 0.7")
Модуль random: генерация псевдослучайных чисел в Python
Многим компьютерным приложениям необходимо генерировать случайные числа. Однако ни одно из них не генерирует действительно случайное число. Python, как и многие другие языки программирования, использует генератор псевдослучайных чисел. Генерация случайных чисел в Python основана на алгоритме Вихрь Мерсенна. Этот метод быстрый и потокобезопасный, но не подходит для криптографических целей.
Стандартная библиотека Python содержит модуль random , в котором есть различные функции для работы со случайными числами.
random.seed([initializer]) – этот метод инициализирует генератор случайных чисел. Когда модуль random импортируется, генератор инициализируется с помощью системного времени. Чтобы повторно запустить генератор, используйте любой объект int , str , byte или bytearray . При помощи этого метода можно воспроизводить одну и ту же последовательность чисел любое количество раз. В примере ниже генератор случайных чисел инициализируется с помощью числа 2 и при каждом запуске программы мы будем получать одну и ту же последовательность чисел.
import random random.seed(2) random_number_1 = random.randint(1, 10) random_number_2 = random.randint(1, 10) print(random_number_1, random_number_2) # 1 2
random.getstate() — эта функция вместе с функцией setstate() помогает воспроизводить одни и те же случайные данные снова и снова. Функция getstate() возвращает внутреннее состояние генератора случайных чисел. Больше информации вы можете найти по ссылке.
random.setstate(state) — эта функция восстанавливает внутреннее состояние генератора.
Следующие функции предназначены для генерации случайных целых чисел:
random.randrange() − эта функция генерирует случайное целое число в пределах заданного диапазона чисел. Может принимать три параметра.
random.randrange([start], stop[, step])
Параметры start и step являются необязательными. Их значения по умолчанию равны 0 и 1 соответственно. Шаг ( step ) определяет интервал между последовательными числами.
>>> random.randrange(10) 5 >>> random.randrange(10, 20) 17 >>> random.randrange(100, 200, 2) 188
Примечание: помните, что выходные данные примеров в этой статье могут не совпадать, так как они генерируются случайным образом.
random.randint(start, stop) — эта функция генерирует случайное целое число x , такое что start ≤ x ≤ stop . Это похоже на функцию randrange() без параметра step .
>>> random.randint(1,10) 6 >>> random.randint(100, 200) 134
Следующие функции работают со случайными числами с плавающей запятой:
random.random() — эта функция генерирует случайное число с плавающей запятой в диапазоне от 0.0 до 1.0.
>>> random.random() 0.668544544081956
random.uniform(start, stop) — эта функция возвращает случайное число x с плавающей запятой, такое что start ≤ x ≤ stop для start ≤ stop и stop ≤ x ≤ start для stop < start .
>>> random.uniform(0.5,1.5) 1.2760281470664903 >>> random.uniform(1,10) 7.336985794193224 >>> random.uniform(10,5) 7.817794757786727
Следующие функции работают c последовательностями, а именно — со строками, списками или кортежами:
random.choice() − эта функция выбирает случайный элемент из последовательности. Если последовательность пуста, то возникает ошибка IndexError .
>>> random.choice("Pythonist") 'o' >>> random.choice(range(10)) 2 >>> random.choice([15,31,6,29,55, 5]) 55 >>> random.choice((15,31,6,29,25, 55)) 15
random.choices() − эта функция случайным образом выбирает несколько элементов из списка. Первый параметр этой функции — последовательность, а второй — количество элементов, которые нужно вернуть. Возвращает список, в котором может повторяться несколько раз один и тот же элемент.
>>> name = "Pythonist" >>> random.choices(name, k = 2) ['s', 'n']
random.shuffle() — эта функция переупорядочивает (перемешивает) элементы в изменяемой (mutable) последовательности и размещает их случайным образом.
>>> num = [10,20,30,40,50] >>> random.shuffle(num) >>> num [50, 20, 40, 30, 10]
random.sample(sequence, n) — эта функция возвращает список случайно выбранных элементов из последовательности. Результирующий список содержит только уникальные элементы.
>>> name = "Pythonist" >>> nm = random.sample(name, k = 5) >>> name, nm (Pythonist, ['n', 'P', 'y', 't', 'h'])
Более подробную информацию о функциях модуля random вы можете найти в документации.
Модуль Random для генерации случайных чисел в Python
Этот модуль реализует генераторы псевдослучайных чисел под различные потребности.
- Для целых чисел есть выбор одного из диапазона.
- Для последовательностей — выбор случайного элемента, функция случайной сортировки списка и функция случайного выбора нескольких элементов из последовательности.
- Есть функции для вычисления однородных, нормальных (Гауссовских), логнормальных, отрицательных экспоненциальных, гамма и бета распределений.
- Для генерации распределений углов доступно распределение фон Мизеса.
Почти все функции модуля зависят от основной функции random() , которая генерирует случайным образом чисто с плавающей точкой(далее float) равномерно в полуоткрытом диапазоне [0.0, 1.0).
Python использует Mersenne Twister в качестве основного генератора. Он производит 53-битные точные float и имеет период 2**19937-1. Основная его реализация в C быстрая и многопоточная. Mersenne Twister один из наиболее широко протестированных генераторов случайных чисел. Однако, будучи полностью детерминированным, он подходит не для любых целей, особенно для криптографических.
Модуль random так же предоставляет класс SystemRandom . Этот класс использует системную функцию os.urandom() для генерации случайных чисел из источников, которые предоставляет операционная система.
Псевдослучайные генераторы этого модуля не должны использоваться в целях безопасности. Для обеспечения безопасности или для криптографического использования ознакомьтесь с модулем secrets .
Функции для целых чисел
random.randrange(stop)
random.randrange(start, stop[, step])
Возвращает случайно выбранный элемент из range(start, stop, step) . Это эквивалентно choice(range(start, stop, step)) , но не создает объект диапазона.
Рандом (random) в Python — как генерировать случайные числа
Случайные числа применяются в программировании в разных случаях, например, для моделирования процессов и в видеоиграх. Для начала разберёмся, какую последовательность можно назвать случайной.
Случайной последовательностью называют набор элементов, полученных таким образом, что любой элемент их этого набора никак не связан ни с каким другим элементом. При этом в программировании обычно последовательность не является строго случайной — в ней для генерации следующего элемента используется предыдущий.
Как работают случайные числа
Полностью случайные числа генерируются истинным генератором случайных чисел (TRNG). Их можно получить, например, бросанием кубика или доставанием шаров из урны. Так как подобных устройств нет в компьютере, то в нем можно получить только "псевдослучайные" числа.
В Python, как и во всех остальных языках программирования, используется генератор псевдослучайных чисел, который выдает как будто случайные, но воспроизводимые числа.
Чтобы понять, как работают генераторы псевдослучайных чисел, рассмотрим работу одного из первых подобных генераторов. Его алгоритм работы был разработан Нейманом. В нем первое число возводят в квадрат, а потом из полученного результата берут средние цифры. Например, первое число 281, возводим его в квадрат, получаем 78961 и берем три цифры, находящиеся в середине – 896. После этого для генерации следующего числа используем 896.
Модуль random
В модуле random реализованы различные генераторы псевдослучайных чисел. Здесь присутствуют методы, с помощью которых можно получить равномерное, Гауссовское, бета и гамма распределения и другие функции. Практически все они зависят от метода random() . В Python, в качестве основного, используется генератор псевдослучайных чисел Mersenne Twister , который выдает 53-х битные вещественные числа.
Как использовать: чтобы начать использовать встроенные генераторы случайных чисел, нужно сначала подключить модуль рандом:
После этого можно вызывать методы модуля 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]) передают три целых числа:
- start – начало диапазона (входит в последовательность);
- stop – конец диапазона (в последовательность не входит);
- step – шаг генерации (если на его месте написать 0, получим ошибку "ValueError").
На выходе функция выдает случайное число в заданном диапазоне.
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.random() print(random_number) > 0.47673250896173136
uniform Сгенерировать число с плавающей точкой можно с помощью функции uniform(a, b) . При этом полученное число будет в диапазоне [a, b) или [a, b] (a входит в диапазон, а вхождение b зависит от округления).
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
choices С помощью функции choices(seq [, weights, cum_weights, k]) можно выбрать 1 или несколько элементов из набора данных. weights , cum_weights и k — необязательные параметры.
- weights — список относительных весов;
- cum_weights — список кумулятивных (совокупных) весов, например weights [10, 5, 30, 5] эквивалентен cum_weights [10, 15, 45, 50].
- k — длина возвращаемого списка (она может быть больше длины переданной последовательности и элементы могут дублироваться).
shuffle Перемешать элементы набора данных можно с помощью функции shuffle(x[, random]) .
- х — последовательность;
- random (необязательный параметр) — задает метод вероятностных распределений. Этот параметр не рекомендуется использовать в версии Python 3.9, а в версии 3.11 его поддержка будет прекращена.
shuffle перемешивает переданную последовательность, и возвращает None .
import random seq = ["Cappuccino", "Latte", "Espresso", "Americano"] random.shuffle(seq) print(seq) > ['Espresso', 'Americano', 'Latte', 'Cappuccino']
sample Чтобы выбрать какое-то количество элементов из набора данных можно воспользоваться функцией sample(х, k) .
- х — последовательность;
- k — количество элементов новой подпоследовательности.
На выходе получаем k уникальных случайных элементов из последовательности.
Если в исходной последовательности есть неуникальные (повторяющиеся) элементы, то каждый их них может появиться в новом списке.
import random seq = [10, 11, 12, 11, 14, 11] random_seq = random.sample(seq, 4) print(random_seq) > [10, 11, 11, 14]
Управление генератором
Генерация чисел в Python не совсем случайна и зависит от состояния генератора случайных чисел. Рассмотрим функции, с помощью которых можно управлять состоянием этого генератора.
getstate Метод getstate() модуля random возвращает объект, в котором записано текущим состояние генератора случайных чисел. Его можно использовать для восстановления состояния генератора. Эта функция не имеет параметров.
import random print(random.getstate()) > (3, (2147483648, 3570748448, 2839542888, 4273933825, 4291584237, .
setstate Метод setstate(state) применяется для восстановления состояния генератора случайных чисел. Обычно его используют совместно с методом getstate() . В качестве параметра в функцию передается объект состояния генератора, полученный, например, с помощью функции getstate() .
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 Генератору случайных чисел нужно число, основываясь на котором он сможет начать генерировать случайные значения.
Задать начальное значение можно с помощью метода seed(a=None, version=2) .
- а — начальное число, с которого начинается генерация. Этот параметр не обязательный. Если он не задан, используется текущее системное время (или доступный механизм генерации, предоставляемый ОС);
- version — стратегия интерпретации первого аргумента. По умолчанию используется версия 2, при которой str, bytes и bytearray преобразуются в int. Версия 1 (используется для совместимости со старыми версиями Python) и в ней для str и bytes генерирует более узкий диапазон начальных значений.
Вероятностное распределение
В теории вероятностей важную роль играет понятие распределение вероятностей. Оно показывает с какой вероятность может наступить каждое из возможных событий. С его помощью можно моделировать как наступление дискретных событий (например, бросание монеты, количество телефонных разговоров за неделю, количество пассажиров в автобусе), так и непрерывных (например, длительность разговора, количество осадков за год, расход электричества за месяц).
Для наглядности рассмотрим самое распространенное нормальное распределение вероятностей. На рисунке ниже приведена кривая нормального распределения.
В модуле random существуют функции, которые позволяют использовать различные методы вероятностных распределений:
- triangular(a, b, mode) — генерирует случайное вещественное число, находящееся в диапазоне от a до b. По умолчанию эти параметры равны: а = 0, b = 1. Третий параметр mode задает среднюю точку вероятности распределения. (подробнее про треугольное распределение тут ).
- betavariate(alpha, beta) — генерирует случайные числа соответствующие параметрам бета-распределения. Возвращаемые значения лежат в диапазоне от 0 до 1.
- expovariate(lambd) — можно получить случайные значения, соответствующие экспоненциальному распределению. Если lambd положительное, то на выходе будут значения от 0 до +∞, а если отрицательное, то от -∞ до 0.
- gammavariate(alpha, beta) — на выходе получаются случайные числа, соответствующие гамма распределению. Параметры alpha и beta, передаваемые в функцию должны быть больше 0.
- gauss(mu, sigma) — на выходе получаются случайные числа, которые соответствуют Гауссовому распределению. В этот метод передаются два параметра: mu — среднее значение и sigma — среднеквадратичное отклонение.
- lognormvariate(mu, sigma) — генерирует случайные значения соответствующие логарифму нормального распределения. То есть если вычислить натуральный логарифм полученного распределения, то в результате получится нормальное распределение с параметрами mu (среднее) и sigma (среднеквадратичное отклонение).
- normalvariate(mu, sigma) — предназначен для генерации случайных значений подчиняющихся закону нормального распределения. В качестве параметров передаются: mu — среднее распределения и sigma — стандартное отклонение.
- vonmisesvariate(mu, kappa) — используется для возврата случайного числа с плавающей запятой с распределением фон Мизеса (или круговым нормальным распределением).
- paretovariate(alpha) — выдает случайные числа, соответствующие распределению Парето. Параметр alpha задает форму.
- weibullvariate(alpha, beta) — Значения, выдаваемые weibullvariate соответствуют распределению Вейбулла. Параметр alpha задает масштаб, а beta форму.
Ознакомиться со всеми функциями модуля random можно на официальном сайте Python в разделе документация .
Best practices
Приведем несколько примеров использования случайных чисел.
Случайная задержка (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) — это добавит случайные миллисекунды к вашим задержкам.
Случайны элемент из списка (с учетом веса)
Дано: веб-сайт. В базе данных 4 баннера, к каждому баннеру указан вес (приоритет к показу).
Необходимо рандомно показывать на сайте 1 баннер, в зависимости от его веса.
Случайный пароль
С помощью генератора случайных чисел можно создавать пароли. Например, сгенерировать стойкий пароль можно так:
В данном примере будет сгенерирован пароль, содержащий минимум 12 символов, среди которых точно будет маленькая буква, большая буква, цифра и символ.
Методы модуля random позволяют получить случайные данные с использованием Mersenne Twister. Однако имейте в виду, что данный способ не является криптографически безопасным (для генерирования паролей есть более надежные варианты).
Кроме модуля random , в Python существуют альтернативные модули, позволяющие получить случайное значения:
- numpy.random — как random , но для массивов;
- os — в состав входит urandom() [криптографически безопасный];
- secrets — модуль для генерации безопасных случайных чисел, байтов и строк [криптографически безопасный];
- uuid — содержит нескольких функций для создания 128-битных идентификаторов [криптографически безопасный].