Документация Python неофициальный перевод

random – Генерация псевдослучайных чиселrandom – Generate pseudo-random numbers

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

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

На вещественной прямой есть функции для вычисления равномерного, нормального (гауссовского), логнормального, отрицательного экспоненциального, гамма и бета распределений. Для генерации распределений углов доступно распределение фон Мизеса.

Почти все функции модуля зависят от базовой функции random(), которая генерирует случайное число с плавающей запятой, равномерно распределённое в полуоткрытом интервале [0.0, 1.0). В Python в качестве основного генератора используется вихрь Мерсенна. Он генерирует числа с плавающей запятой точностью 53 бита и имеет период 2**19937-1. Базовая реализация на C быстра и потокобезопасна. Вихрь Мерсенна – один из наиболее тщательно протестированных генераторов случайных чисел. Однако, будучи полностью детерминированным, он не подходит для всех целей и совершенно непригоден для криптографии.

Функции, предоставляемые этим модулем, на самом деле являются привязанными методами скрытого экземпляра класса random.Random. Можно создать собственные экземпляры Random, чтобы получить генераторы, которые не разделяют состояние.

Класс Random также можно наследовать, если требуется использовать другой базовый генератор собственной разработки: в этом случае нужно переопределить методы random(), seed(), getstate() и setstate(). При желании новый генератор может предоставлять метод getrandbits() – это позволяет randrange() выполнять выборку из диапазона произвольного размера.

Функции учёта:

random.seed([x])

Initialize the basic random number generator. Optional argument x can be any hashable object. If x is omitted or None, current system time is used; current system time is also used to initialize the generator when the module is first imported. If randomness sources are provided by the operating system, they are used instead of the system time (see the os.urandom() function for details on availability).

Если x не является None или целым числом, используется hash(x). Если x – целое число, используется непосредственно x.

random.getstate()
Возвращает объект, фиксирующий текущее внутреннее состояние генератора. Этот объект можно передать в setstate() для восстановления состояния.
random.setstate(state)
state должен быть получен из предыдущего вызова getstate(), а setstate() восстанавливает внутреннее состояние генератора до того, каким оно было на момент вызова setstate().
random.jumpahead(n)
Изменяет внутреннее состояние на другое, которое, вероятно, находится далеко от текущего. n – неотрицательное целое число, используемое для перемешивания текущего вектора состояния. Это особенно полезно в многопоточных программах при использовании нескольких экземпляров класса Random: с помощью setstate() или seed() можно привести все экземпляры к одному внутреннему состоянию, а затем с помощью jumpahead() развести их состояния далеко друг от друга.
random.getrandbits(k)
Возвращает целое число Python из k случайных битов. Этот метод предоставляется генератором MersenneTwister, и некоторые другие генераторы также могут реализовывать его как опциональную часть API. Когда он доступен, getrandbits() позволяет randrange() работать с произвольно большими диапазонами.

Функции для целых чисел:

random.randrange([start], stop[, step])
Возвращает случайно выбранный элемент из range(start, stop, step). Это эквивалентно choice(range(start, stop, step)), но не создаёт объект range.
random.randint(a, b)
Возвращает случайное целое число N такое, что a <= N <= b.

Функции для последовательностей:

random.choice(seq)
Возвращает случайный элемент из непустой последовательности seq. Если seq пуста, возбуждает IndexError.
random.shuffle(x[, random])

Перемешивает последовательность x на месте. Необязательный аргумент random – функция без аргументов, возвращающая случайное число с плавающей запятой в [0.0, 1.0); по умолчанию это функция random().

Обратите внимание, что даже для довольно малого len(x) общее число перестановок x больше периода большинства генераторов случайных чисел; это означает, что большинство перестановок длинной последовательности никогда не могут быть сгенерированы.

random.sample(population, k)

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

Возвращает новый список, содержащий элементы из population, не изменяя исходную population. Результирующий список упорядочен по порядку выбора, так что все подсписки также будут корректными случайными выборками. Это позволяет разделить победителей розыгрыша (выборку) на обладателей главного и второго призов (подсписки).

Элементы population не обязаны быть хэшируемыми или уникальными. Если population содержит повторения, то каждое вхождение является возможным элементом выборки.

Чтобы выбрать выборку из диапазона целых чисел, используйте объект range() в качестве аргумента. Это особенно быстро и эффективно по памяти для выборки из большой популяции: sample(range(10000000), 60).

Следующие функции генерируют конкретные вещественные распределения. Имена параметров функций соответствуют переменным в уравнении распределения, как принято в математической практике; большинство этих уравнений можно найти в любом учебнике по статистике.

random.random()
Возвращает следующее случайное число с плавающей запятой в диапазоне [0.0, 1.0).
random.uniform(a, b)
Возвращает случайное число с плавающей запятой N такое, что a <= N <= b для a <= b и b <= N <= a для b < a.
random.triangular(low, high, mode)
Возвращает случайное число с плавающей запятой N такое, что low <= N <= high и с заданной mode между этими границами. Границы low и high по умолчанию равны нулю и единице. Аргумент mode по умолчанию равен середине между границами, что даёт симметричное распределение.
random.betavariate(alpha, beta)
Бета-распределение. Условия на параметры: alpha > 0 и beta > 0. Возвращаемые значения находятся в диапазоне от 0 до 1.
random.expovariate(lambd)
Экспоненциальное распределение. lambd равно 1.0, делённой на желаемое среднее значение. (Параметр мог бы называться «lambda», но это зарезервированное слово в Python.) Возвращаемые значения находятся в диапазоне от 0 до положительной бесконечности.
random.gammavariate(alpha, beta)
Гамма-распределение. (Не гамма-функция!) Условия на параметры: alpha > 0 и beta > 0.
random.gauss(mu, sigma)
Гауссово распределение. mu – это среднее, а sigma – это стандартное отклонение. Эта функция немного быстрее, чем normalvariate(), определённая ниже.
random.lognormvariate(mu, sigma)
Логнормальное распределение. Если взять натуральный логарифм этого распределения, получится нормальное распределение со средним mu и стандартным отклонением sigma. mu может принимать любое значение, а sigma должна быть больше нуля.
random.normalvariate(mu, sigma)
Нормальное распределение. mu – это среднее, а sigma – стандартное отклонение.
random.vonmisesvariate(mu, kappa)
mu – это средний угол, выраженный в радианах от 0 до 2*pi, а kappa – параметр концентрации, который должен быть больше или равен нулю. Если kappa равен нулю, это распределение сводится к равномерному случайному углу в диапазоне от 0 до 2*pi.
random.paretovariate(alpha)
Распределение Парето. alpha – параметр формы.
random.weibullvariate(alpha, beta)
Распределение Вейбулла. alpha – параметр масштаба, а beta – параметр формы.

Альтернативные генераторы:

class random.SystemRandom([seed])
Класс, использующий функцию os.urandom() для генерации случайных чисел из источников, предоставляемых операционной системой. Доступен не на всех системах. Не опирается на состояние программного обеспечения, и последовательности невоспроизводимы. Соответственно, методы seed() и jumpahead() не действуют и игнорируются. Методы getstate() и setstate() при вызове возбуждают NotImplementedError.

Примеры базового использования:

>>> random.random()        # Случайный float x, 0.0 <= x < 1.0
0.37444887175646646
>>> random.uniform(1, 10)  # Случайный float x, 1.0 <= x < 10.0
1.1800146073117523
>>> random.randint(1, 10)  # Целое число от 1 до 10 включительно
7
>>> random.randrange(0, 101, 2)  # Чётное целое число от 0 до 100
26
>>> random.choice('abcdefghij')  # Выбрать случайный элемент
'c'

>>> items = [1, 2, 3, 4, 5, 6, 7]
>>> random.shuffle(items)
>>> items
[7, 3, 2, 5, 6, 4, 1]

>>> random.sample([1, 2, 3, 4, 5],  3)  # Выбрать 3 элемента
[4, 1, 5]

См. также

M. Matsumoto и T. Nishimura, «Mersenne Twister: A 623-dimensionally equidistributed uniform pseudorandom number generator», ACM Transactions on Modeling and Computer Simulation, Том 8, № 1, Январь, стр. 3-30, 1998.