- Случайные числа в Python
- Случайное целое число в Python
- С плавающей запятой
- Random seed в Python
- Случайный список – choice(), shuffle(), sample()
- Python 3: Генерация случайных чисел (модуль random)¶
- random.random¶
- random.seed¶
- random.uniform¶
- random.randint¶
- random.choince¶
- random.randrange¶
- random.shuffle¶
- Вероятностные распределения¶
- Примеры¶
- Генерация произвольного пароля¶
- Ссылки¶
Случайные числа в Python
Чтобы работать со случайным числом в Python, нам нужно сначала импортировать модуль random, который обеспечивает псевдослучайность.
Модуль случайных чисел в Python использует Mersenne Twister в качестве основного генератора случайных чисел. Таким образом, этот модуль совершенно не подходит для криптографических целей, поскольку является детерминированным. Однако мы можем использовать модуль random в большинстве случаев, потому что он содержит множество хорошо известных случайных распределений.
Случайное целое число в Python
В этом разделе мы обсудим случайную генерацию целых чисел. Мы можем использовать функцию randint (a, b), чтобы получить случайное целое число от диапазона a до b. Опять же, мы можем получить число из последовательности, используя функцию randrange (start, stop, step). Давайте посмотрим на пример, чтобы получить случайное целое число.
import random as rand a = 10 b = 100 print('\na =', a, 'and b =', b) print('printing number [', a, ', ', b, ') :', rand.randint(a,b)) start = 1 stop = 12 step = 2 print('\nsequence = [1, 3, 5, 7, 9, 11]') print('printing one number from the sequence :', rand.randrange(start, stop, step))
Для каждого прогона результат будет меняться. Однако здесь приведен пример вывода.
С плавающей запятой
Есть несколько функций, которые возвращают вещественное число или с плавающей точкой в случайном порядке. Например, функция random() возвращает действительное число от 0 до 1 (исключая).
Опять же, функции uniform (a, b) возвращают действительное число от a до b. Кроме того, в модуле random также доступны некоторые случайные распределения. Мы также можем получить реальное число из этого распределения.
Мы можем получить случайные числа из экспоненциального распределения, используя экспоненциальную функцию (лямбд).
import random as rand print('Random number from 0 to 1 :', rand.random()) print('Uniform Distribution [1,5] :', rand.uniform(1, 5)) print('Gaussian Distribution mu=0, sigma=1 :', rand.gauss(0, 1)) print('Exponential Distribution lambda = 1/10 :', rand.expovariate(1/10))
Значения на выходе будут отличаться для каждого выполнения. Вы получите такой результат:
Random number from 0 to 1 : 0.5311529501408693 Uniform Distribution [1,5] : 3.8716411264052546 Gaussian Distribution mu=0, sigma=1 : 0.8779046620056893 Exponential Distribution lambda = 1/10 : 1.4637113187536595
Random seed в Python
Генерация случайных чисел Python основана на предыдущем числе, поэтому использование системного времени – отличный способ гарантировать, что каждый раз, когда наша программа запускается, она генерирует разные числа. Мы можем использовать функцию random seed() для установки начального значения.
Обратите внимание: если наше начальное значение не меняется при каждом выполнении, мы получим одинаковую последовательность чисел.
Ниже приведен пример программы, подтверждающей эту теорию о ценности seed.
import random random.seed(10) print('1st random number = ', random.random()) print('2nd random number = ', random.random()) print('1st random int = ', random.randint(1, 100)) print('2nd random int = ', random.randint(1, 100)) # resetting the seed to 10 i.e. first value random.seed(10) print('3rd random number = ', random.random()) print('4th random number = ', random.random()) print('3rd random int = ', random.randint(1, 100)) print('4th random int = ', random.randint(1, 100))
Случайный список – choice(), shuffle(), sample()
Есть несколько функций для использования случайности в последовательности. Например, с помощью функции choice() вы можете получить случайный элемент из последовательности.
Опять же, используя функцию shuffle(), вы можете перетасовать элементы в последовательности.
С помощью функции sample(), вы можете получить x количество элементов из последовательности случайным образом. Итак, давайте посмотрим следующий код для примера случайного списка:
import random as rand # initialize sequences string = "inconvenience" l = [1, 2, 3, 4, 10, 15] # get a single element randomly print('Single character randomly chosen :', rand.choice(string)) print('one randomly chosen number :', rand.choice(l)) # get multiple element print('Randomly chosen 4 character from string :', rand.sample(string, 4)) print('Randomly chosen 4 length list :', rand.sample(l, 4)) # shuffle the list rand.shuffle(l) print('list is shuffled :', l) # print the list
Получаем следующий результат:
Single character randomly chosen : i one randomly chosen number : 10 Randomly chosen 4 character from string : ['e', 'c', 'n', 'n'] Randomly chosen 4 length list : [2, 10, 3, 15] list is shuffled : [2, 4, 15, 3, 10, 1]
Python 3: Генерация случайных чисел (модуль random)¶
Python порождает случайные числа на основе формулы, так что они не на самом деле случайные, а, как говорят, псевдослучайные [1]. Этот способ удобен для большинства приложений (кроме онлайновых казино) [2].
[1] | Википедия: Генератор псевдослучайных чисел |
[2] | Доусон М. Программируем на Python. — СПб.: Питер, 2014. — 416 с.: ил. — 3-е изд |
Модуль 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 произвольно выбранный элемент из списка.