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

9.6. 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.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. Псевдоним для randrange(a, b+1).

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

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.

Конечное значение b может входить или не входить в диапазон в зависимости от округления чисел с плавающей запятой в уравнении a + (b-a) * random().

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 до положительной бесконечности, если lambd положительно, и от отрицательной бесконечности до 0, если lambd отрицательно.
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() не имеет эффекта и игнорируется. Методы 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.

Complementary-Multiply-with-Carry recipe для совместимого альтернативного генератора случайных чисел с длинным периодом и сравнительно простыми операциями обновления.