Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.
Приложение к видеоуроку
Генерация случайных чисел в Python
Библиотека random очень полезный инструмент для решения самых разных задач. Рассмотрим функции библиотеки с некоторыми примерами. Как обычно библиотека подключается командой import
import random.
Базовая часть библиотеки
- random.random() — генерирует вещественное число в промежутке от 0 до 1. При вторичном вызове генерирует новое случайное число из того же промежутка. Алгоритм устроен так, что равномерно заполняет указанный промежуток.
- random.seed() — задаёт новую последовательность случайных чисел. При отсутствии данного метода в программе или при его использовании без параметра, для создания новой последовательности используется системное время. При использовании конкретного параметра каждый раз будет генерироваться одна и та же случайная последовательность.
import random as r
r.seed(12)
print(r.random())
print(r.random())
print(r.random())
print(r.random())
Пр запуске такой программы, каждый раз будут генерироваться одни и те же числа
import random as r
r.seed()
print(r.random())
print(r.random())
print(r.random())
print(r.random())
При запуске этой программы, каждый раз будет генерироваться новая последовательность чисел. - random.getstate(), random.setstate() — первый метод возвращает кортеж с параметрами состояния генератора случайных чисел (объект state). Второй метод может задать состояние генератора случайных чисел на основе кортежа, полученного первым методом.
- random.randint() — генерирует целое случайное число в указанном промежутке. Значения концов промежутка, также могут попасть в множество случайных чисел. Так random.randint(0, 4) может сгенерировать числа 0, 1, 2, 3, 4.
- random.randomrange() — генерация случайно последовательности целых чисел с шагом. Метод имеет три параметра: begin, end, step. При этом step (шаг) определяет последовательность чисел, которые могут быть сгенерированы. Последний параметр может быть опущен и тогда он полагается равным 1. Второй параметр это граница последовательности, которая никогда не генерируется. Например random.randrange(3, 11, 2) может сгенерировать одно из следующих чисел 3, 5, 7, 9.
- random.choice() — метод случайным образом выбирает элемент списка. Например
print(random.choice([1, 5, 'qwerty', 'pi', 0]))
будет напечатан один из элементов списка. - random.shuffle() — перемешивает элементы списка случайным образом. Например
import random as r
ls = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
r.shuffle(ls)
print(ls)
Получаем
[6, 5, 9, 1, 8, 7, 2, 0, 3, 4] - random.uniform() — возвращает вещественное число из заданного промежутка. Например r.uniform(0.1, 100.1).
- random.sample() — позволяет выбрать из последоватльности сразу несколько случайных элементов. Например
import random as r
print(r.sample([1, 2, '123q', 3, 'acv'], 3))
сгенерировала
['acv', 1, 3] - random.getrandbits() — генерирует число, состоящее из указанного количества первых случайно определённых битов. Например, random.getrandbits(4) , будет генерировать числа в промежутке от 0 до 15 с включением 0 и 15.
Генерация распределений
Часть библиотеки random отводится для генерации случайных чисел подчиняющихся определённым распределениям. Поскольку распределения относится скорее к математике, чем к программированию просто перечислим эти методы библиотеки. Я думаю вернуться к этому вопросу, когда займёмся графикой.
- random.triangular() — генерация чисел треугольного распределения.
- random.betavariate() — генерация чисел бета-распределения.
- random.expovariate() — генерация чисел экспоненциального распределения.
- random.gammavariate() — генерация чисел гамма-распределения.
- random.gauss() — генерация чисел распределения Гауса.
- random.lognormvariate() — генерация чисел логнормального распределения.
- random.normalvariate() — генерация чисел нормального распределения.
- random.vonmisesvariate() — генерация чисел распределения фон Мизеса.
- random.paretovariate() — генерация чисел распределения Парето.
- random.weibullvariate() — генерация чисел распределения Вейбулла.
Примеры программ
Генерация пароля из разных символов
import random as r
s1 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
s2 = 'zyxwvutsrqponmlkjihgfedcba'
s3 = '0123456789'
s4 = '@#%$&^!)(*?'
ls = list(s1 + s2 + s3 + s4)
r.shuffle(ls)
psw = ''.join(ls[0:12])
print(psw)
Генерация пароля, с использованием одинаковых символов
import random as r
s1 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
s2 = 'zyxwvutsrqponmlkjihgfedcba'
s3 = '0123456789'
s4 = '@#%$&^!)(*?'
ls = list(s1 + s2 + s3 + s4)
r.shuffle(ls)
psw = ''.join([r.choice(ls) for i in range(0, 12)])
print(psw)
Получение числа pi с помощью случайных чисел
Суть решения заключается в следующем. Представим себе квадрат со стороной равной 1. В квадрат вписана окружность. Соответственно радиус окружности равен 0.5. Площадь квадрата равна 1, площадь окружности pi*0.25. Теперь будем генерировать вещественные числа, в промежутке от 0 до 1. Пусть будет m генераций. Из них n попадет в круг. Поскольку точки должны располагаться боле-менее равномерно по квадрату, предположим, что pi ≈ (n / m) / 0.25. Чем больше будет сгенерировано случайных чисел, тем по идее более точным получиться число pi.
Вот несколько значений для m = 20000: 3.14.52, 3.14.78, 3.14.52, 3.1426.
Хорошего программирования. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.