Python 3: Генерация случайных чисел (модуль random)¶
«Генерация случайных чисел слишком важна, чтобы оставлять её на волю случая»
— Роберт Кавью
Python порождает случайные числа на основе формулы, так что они не на самом деле случайные, а, как говорят, псевдослучайные [1]. Этот способ удобен для большинства приложений (кроме онлайновых казино) [2].
[1] | Википедия: Генератор псевдослучайных чисел |
[2] | Доусон М. Программируем на Python. — СПб.: Питер, 2014. — 416 с.: ил. — 3-е изд |
Модуль random позволяет генерировать случайные числа. Прежде чем использовать модуль, необходимо подключить его с помощью инструкции:
import 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 произвольно выбранный элемент из списка.