Случайное число

Как и многие другие языки программирования, Python позволяет работать с генераторами случайных значений. С их помощью можно оперативно создавать последовательности из различных чисел или символов, предугадать которые невозможно. Для этой цели в Python применяется встроенная библиотека с множеством методов для управляемой генерации.

Что такое случайные числа?

Случайные числа представляют собой произвольные данные, которые были получены в результате автоматической генерации компьютерной программой. Подобная информация используется во многих видах программного обеспечения, где необходимо иметь дело с непредсказуемыми величинами. Ярким примером тому являются игровые автоматы либо казино, в которых каждый раз генерируется новая выигрышная комбинация чисел. Также данный подход применяется в криптографических целях для создания надежных паролей.

Стоит заметить, что стандартные средства Python не способны предоставлять в программе истинно случайные значения. Они предоставляют псевдо случайную последовательность. Инициализируется она от какого либо случайного числа. То есть если мы будем инициализировать последовательность одним и тем же числом, то она будет каждый раз выдавать одинаковые данные. Чтобы этого не было, для инициализации берется значение системных часов.

Но есть механизмы, позволяющие получать каждый раз совершенно новые и независимые последовательности чисел. Они имеют существенный недостаток. Существенно снижается быстродействие. Это происходит из-за того, что время получения каждого числа увеличивается в несколько раз.

Так что обычно используется метод генерации псевдослучайных величин с иницилизацией от системных часов.

Реализации случайных чисел в Python

Язык программирования Python содержит в себе несколько разных модулей, применяемых для генерации псевдослучайных величин. Все они, как правило, используют в своих целях текущее системное время, которое установлено на компьютере. Это гарантирует получение разных последовательностей значений при каждом новом обращении к генератору. Среди инструментов, которые предназначены для работы с псевдослучайными числами, находится довольно обширная библиотека random, а также функции numpy.random и os.urandom.

Особенности их применения:

  • Стандартный модуль random в Python 3 включает множество методов для генерации как целых, так и вещественных чисел, а также последовательностей с определенными параметрами.
  • Функция numpy.random используется для заполнения массивов случайными величинами.
  • Функция os.urandom предоставляет набор из случайных байтов, что применимо в криптографии.
В модуле random есть класс SystemRandom, внутри реализации которого идет обращение как раз к os.urandom. В этом альтернативном генераторе реализованы те же функции, но их уже можно применять в криптографии.

Наиболее широкое применение получила в Python библиотека random. Поэтому далее мы ее и рассмотрим подробно.

Модуль random

Ниже приведена таблица, где описаны самые главные методы из подключаемого модуля, входящего в состав стандартных библиотек Python. В таблице приведены названия функций, а также доступный перечень параметров с небольшой характеристикой.

Метод Характеристика
random() возвращает число в диапазоне от 0 до 1
seed(a) настаивает генератор на новую последовательность a
randint(a, b) возвращает целое число в диапазоне от a и b
randrange(a, b, c) возвращает целое число в диапазоне от a до b с шагом c
uniform(a, b) возвращает вещественное число в диапазоне от a и b
shuffle(a) перемешивает значения в списке a
choice(a) возвращает случайный элемент из списка a
sample(a, b) возвращает последовательность длиной b из набора a
getstate() возвращает внутреннее состояние генератора
setstate(a) восстанавливает внутреннее состояние генератора a
getrandbits(a) возвращает a случайно сгенерированных бит
triangular(a, b, c) возвращает вещественное число от a до b с распределением c

Здесь хотелось бы описать функцию seed. Она как раз и применяется для задания инициализирующего числа псевдо случайной последовательности. При вызове seed без параметра, берется значение системного таймера. Эта функция вызывается в конструкторе класса Random.

В примерах мы рассмотрим, как применяются основные функции. А так же в конце рассмотрим как используется SystemRandom.

Примеры

Чтобы воспользоваться возможностями генерации случайных чисел в Python 3, следует произвести импорт библиотеки random, вынеся ее в начало исполняемого файла при помощи ключевого слова import.

Вещественные числа

В модуле есть одноименная функция random. В Python она используется чаще, чем другие функции этого модуля. Функция возвращает вещественное число в промежутке от 0 до 1. В следующем примере демонстрируется создание трех разных переменных a, b и c.

import random
a = random.random()
b = random.random()
print(a)
print(b)

0.547933286519
0.456436031781

Целые числа

Для получения случайных целых чисел в определенном диапазоне используется функция randint, принимающая два аргумента: минимальное и максимальное значение. Программа, показанная ниже отображает генерацию трех разных значений в промежутке от 0 до 9.

import random
a = random.randint(0, 9)
b = random.randint(0, 9)
print(a)
print(b)

4
7

Диапазоны целых

Метод randrange позволяет генерировать целочисленные значения, благодаря работе с тремя параметрами: минимальная и максимальная величина, а также длина шага. Вызвав функцию с одним аргументом, начальная граница получит значение 0, а интервал станет равен 1. Для двух аргументов автоматически инициализируется только длина шага. Работа данного метода с трема разными наборами параметров показана в следующем примере.

import random
a = random.randrange(10)
b = random.randrange(2, 10)
c = random.randrange(2, 10, 2)
print(a)
print(b)
print(c)

9
5
2

Диапазоны вещественных

Сгенерировать вещественное число поможет метод под названием uniform. Он принимает всего два аргумента, обозначающих минимальное и максимальное значения. Демонстрация его работы располагается в следующем примере кода, где создаются переменные a, b и c.

import random
a = random.uniform(0, 10)
b = random.uniform(0, 10)
print(a)
print(b)

4.85687375091
3.66695202551

Использование в генераторах

Возможности генерации псевдослучайных чисел можно использовать и для создания последовательностей. В следующем фрагменте кода создается набор чисел при помощи генератора списка со случайным наполнением и длиной. Как можно заметить, в данном примере функция randint вызывается дважды: для каждого элемента и размера списка.

import random
a = [random.randint(0, 9) for i in range(random.randint(0, 9))]
print(a)

[4, 1, 8, 6, 6, 9, 7]

Перемешивание

Метод shuffle дает возможность перемешать содержимое уже созданного списка. Таким образом, все его элементы будут находиться в абсолютно случайном порядке. Пример, где отображается работа этой функции со списком a из 10 значений, располагается дальше.

import random
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
random.shuffle(a)
print(a)

[3, 9, 0, 7, 6, 2, 5, 1, 8, 4]

Случайный элемент списка

При помощи функции choice можно извлечь случайный элемент из существующего набора данных. В следующем примере переменная b получает некое целое число из списка a.

import random
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b = random.choice(a)
print(b)

7

Несколько элементов списка

Извлечь из последовательности данных можно не только один элемент, но и целый набор значений. Функция sample позволит получить абсолютно новый список чисел из случайных компонентов уже существующего списка. В качестве первого аргумента необходимо ввести исходную последовательность, а на месте второго указать желаемую длину нового массива.

import random
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
a = random.sample(a, 5)
print(a)

[8, 0, 9, 4, 6]

Генерация букв

Возможности стандартной библиотеки позволяют генерировать не только числа, но и буквы. В следующем примере показывается инициализация трех разных переменных случайными символами латиницы. Для этого необходимо произвести импортирование модуля string, а затем воспользоваться списком letters, который включает все буквы английского алфавита.

import random
import string
a = random.choice(string.letters)
b = random.choice(string.letters)
c = random.choice(string.letters)
print(a)
print(b)
print(c)

J
i
L

Как можно заметить, отображаются буквы в разном регистре. Для того чтобы преобразовать их к общему виду, рекомендуется вызвать стандартные строковые методы upper или lower.

SystemRandom

Как уже говорилось ранее, SystemRandom основана на os.urandom. Она выдает так же псевдослучайные данные, но они зависят дополнительно и от операционной системы. Результаты используются в криптографии. Есть недостаток – то что функции SystemRandom отрабатывают в несколько раз дольше. Рассмотрим пример использования:

import random
sr = random.SystemRandom()
a = sr.random()
b = sr.randint(0, 9)
c = sr.randrange(2, 10, 2)
print(a)
print(b)
print(c)

0.36012464614815465
2
8

Заключение

Таким образом, язык программирования Python содержит массу встроенных методов для генерации и обработки случайных значений. Пользоваться ими можно при помощи разных библиотек, входящих в стандартный набор инструментов платформы. Благодаря данным функциям можно задавать различные условия, а также ограничения для своих генераторов.