random.md
1> **Источник:** https://python-all.ru/2.7/library/random.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 9.6. [`random`](https://python-all.ru/2.7/library/random.html#module-random) – Генерация псевдослучайных чисел89**Исходный код:** [Lib/random.py](https://python-all.ru/src/2.7/Lib/random.py)1011---1213Этот модуль реализует генераторы псевдослучайных чисел для различных распределений.1415Для целых чисел – равномерный выбор из диапазона. Для последовательностей – равномерный выбор случайного элемента, функция для генерации случайной перестановки списка на месте и функция для случайной выборки без возвращения.1617На вещественной прямой есть функции для вычисления равномерного, нормального (гауссовского), логнормального, отрицательного экспоненциального, гамма и бета распределений. Для генерации распределений углов доступно распределение фон Мизеса.1819Почти все функции модуля зависят от базовой функции [`random()`](https://python-all.ru/2.7/library/random.html#random.random), которая генерирует случайное число с плавающей запятой, равномерно распределённое в полуоткрытом диапазоне \[0.0, 1.0). Python использует вихрь Мерсенна в качестве основного генератора. Он выдаёт числа с плавающей запятой точностью 53 бита и имеет период 2\*\*19937-1. Базовая реализация на C быстра и потокобезопасна. Вихрь Мерсенна – один из наиболее тщательно протестированных генераторов случайных чисел. Однако, будучи полностью детерминированным, он не подходит для всех целей и совершенно непригоден для криптографии.2021Функции, предоставляемые этим модулем, на самом деле являются привязанными методами скрытого экземпляра класса `random.Random`. Можно создать собственные экземпляры `Random`, чтобы получить генераторы, не разделяющие состояние. Это особенно полезно в многопоточных программах: создайте отдельный экземпляр `Random` для каждого потока и используйте метод [`jumpahead()`](https://python-all.ru/2.7/library/random.html#random.jumpahead), чтобы сгенерированные последовательности в разных потоках с высокой вероятностью не пересекались.2223Класс `Random` также можно наследовать, если требуется использовать другой базовый генератор собственной разработки: в этом случае переопределите методы `random()`, `seed()`, `getstate()`, `setstate()` и `jumpahead()`. При необходимости новый генератор может предоставить метод `getrandbits()` – это позволяет [`randrange()`](https://python-all.ru/2.7/library/random.html#random.randrange) выполнять выборку из произвольно большого диапазона.2425Новое в версии 2.4: метод [`getrandbits()`](https://python-all.ru/2.7/library/random.html#random.getrandbits).2627В качестве примера наследования модуль [`random`](https://python-all.ru/2.7/library/random.html#module-random) предоставляет класс [`WichmannHill`](https://python-all.ru/2.7/library/random.html#random.WichmannHill), который реализует альтернативный генератор на чистом Python. Этот класс предоставляет обратно совместимый способ воспроизведения результатов из более ранних версий Python, в которых алгоритм Wichmann-Hill использовался в качестве основного генератора. Обратите внимание, что этот генератор Wichmann-Hill больше не рекомендуется к использованию: его период слишком мал по современным меркам, и известно, что генерируемая последовательность не проходит некоторые строгие тесты на случайность. См. ссылки ниже для ознакомления с недавним вариантом, который исправляет эти недостатки.2829Изменено в версии 2.3: MersenneTwister заменил Wichmann-Hill в качестве генератора по умолчанию.3031Модуль [`random`](https://python-all.ru/2.7/library/random.html#module-random) также предоставляет класс [`SystemRandom`](https://python-all.ru/2.7/library/random.html#random.SystemRandom), который использует системную функцию [`os.urandom()`](https://python-all.ru/2.7/library/os.html#os.urandom) для генерации случайных чисел из источников, предоставляемых операционной системой.3233> **Предупреждение**34>35> Псевдослучайные генераторы этого модуля не следует использовать в целях безопасности. Используйте [`os.urandom()`](https://python-all.ru/2.7/library/os.html#os.urandom) или [`SystemRandom`](https://python-all.ru/2.7/library/random.html#random.SystemRandom), если требуется криптографически стойкий генератор псевдослучайных чисел.3637Функции учёта:3839#### `random.seed(a=None)`4041Инициализирует внутреннее состояние генератора случайных чисел.4243Вызов `None` или вызов без аргумента инициализирует генератор от текущего времени или от источника случайности операционной системы, если он доступен (подробнее о доступности см. функцию [`os.urandom()`](https://python-all.ru/2.7/library/os.html#os.urandom)).4445Если *a* не является `None`, [`int`](https://python-all.ru/2.7/library/functions.html#int) или [`long`](https://python-all.ru/2.7/library/functions.html#long), то вместо него используется `hash(a)`. Обратите внимание, что хеш-значения для некоторых типов недетерминированы, когда включено [`PYTHONHASHSEED`](https://python-all.ru/2.7/using/cmdline.html#envvar-PYTHONHASHSEED).4647Изменено в версии 2.4: ранее ресурсы операционной системы не использовались.4849#### `random.getstate()`5051Возвращает объект, фиксирующий текущее внутреннее состояние генератора. Этот объект можно передать в [`setstate()`](https://python-all.ru/2.7/library/random.html#random.setstate) для восстановления состояния.5253Новое в версии 2.1.5455Изменено в версии 2.6: значения состояния, созданные в Python 2.6, нельзя загрузить в более ранние версии.5657#### `random.setstate(state)`5859*state* должен быть получен из предыдущего вызова [`getstate()`](https://python-all.ru/2.7/library/random.html#random.getstate), а [`setstate()`](https://python-all.ru/2.7/library/random.html#random.setstate) восстанавливает внутреннее состояние генератора в то, которое было на момент вызова [`getstate()`](https://python-all.ru/2.7/library/random.html#random.getstate).6061Новое в версии 2.1.6263#### `random.jumpahead(n)`6465Изменяет внутреннее состояние на другое, с высокой вероятностью далёкое от текущего. *n* – неотрицательное целое число, используемое для перемешивания текущего вектора состояния. Это наиболее полезно в многопоточных программах в сочетании с несколькими экземплярами класса `Random`: [`setstate()`](https://python-all.ru/2.7/library/random.html#random.setstate) или [`seed()`](https://python-all.ru/2.7/library/random.html#random.seed) можно использовать для приведения всех экземпляров к одному внутреннему состоянию, а затем [`jumpahead()`](https://python-all.ru/2.7/library/random.html#random.jumpahead) – для разнесения состояний экземпляров на большое расстояние.6667Новое в версии 2.1.6869Изменено в версии 2.3: Вместо перехода к конкретному состоянию через *n* шагов вперёд, `jumpahead(n)` переходит к другому состоянию, которое, вероятно, отделено многими шагами.7071#### `random.getrandbits(k)`7273Возвращает целое число [`long`](https://python-all.ru/2.7/library/functions.html#long) Python с *k* случайными битами. Этот метод предоставляется генератором MersenneTwister; некоторые другие генераторы также могут предоставлять его как опциональную часть API. Когда доступен, [`getrandbits()`](https://python-all.ru/2.7/library/random.html#random.getrandbits) позволяет [`randrange()`](https://python-all.ru/2.7/library/random.html#random.randrange) работать с произвольно большими диапазонами.7475Новое в версии 2.4.7677Функции для целых чисел:7879#### `random.randrange(stop)`8081#### `random.randrange(start, stop[, step])`8283Возвращает случайно выбранный элемент из `range(start, stop, step)`. Это равнозначно `choice(range(start, stop, step))`, но на самом деле не создаёт объект range.8485Новое в версии 1.5.2.8687#### `random.randint(a, b)`8889Возвращает случайное целое число *N*, такое что `a <= N <= b`.9091Функции для последовательностей:9293#### `random.choice(seq)`9495Возвращает случайный элемент из непустой последовательности *seq*. Если *seq* пуста, возбуждает [`IndexError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.IndexError).9697#### `random.shuffle(x[, random])`9899Перемешивает последовательность *x* на месте. Необязательный аргумент *random* – это функция без аргументов, возвращающая случайное число с плавающей запятой в диапазоне \[0.0, 1.0); по умолчанию это функция [`random()`](https://python-all.ru/2.7/library/random.html#random.random).100101Обратите внимание, что даже для довольно малых `len(x)` общее количество перестановок *x* превышает период большинства генераторов случайных чисел; это означает, что большинство перестановок длинной последовательности никогда не могут быть сгенерированы.102103#### `random.sample(population, k)`104105Возвращает список длины *k* из уникальных элементов, выбранных из последовательности population. Используется для случайной выборки без возвращения.106107Новое в версии 2.3.108109Возвращает новый список, содержащий элементы из population, не изменяя исходную population. Результирующий список упорядочен по порядку выбора, так что все подсписки также будут корректными случайными выборками. Это позволяет разделить победителей розыгрыша (выборку) на обладателей главного и второго призов (подсписки).110111Элементы population не обязаны быть [хэшируемыми](https://python-all.ru/2.7/glossary.html#term-hashable) или уникальными. Если population содержит повторения, то каждое вхождение является возможным элементом выборки.112113Чтобы выбрать выборку из диапазона целых чисел, используйте объект [`xrange()`](https://python-all.ru/2.7/library/functions.html#xrange) в качестве аргумента. Это особенно быстро и эффективно по памяти для выборки из большой совокупности: `sample(xrange(10000000), 60)`.114115Следующие функции генерируют конкретные вещественные распределения. Имена параметров функций соответствуют переменным в уравнении распределения, как принято в математической практике; большинство этих уравнений можно найти в любом учебнике по статистике.116117#### `random.random()`118119Возвращает следующее случайное число с плавающей запятой в диапазоне \[0.0, 1.0).120121#### `random.uniform(a, b)`122123Возвращает случайное число с плавающей точкой *N* такое, что `a <= N <= b` для `a <= b` и `b <= N <= a` для `b < a`.124125Конечное значение `b` может как входить, так и не входить в диапазон в зависимости от округления чисел с плавающей запятой в уравнении `a + (b-a) * random()`.126127#### `random.triangular(low, high, mode)`128129Возвращает случайное число с плавающей точкой *N* такое, что `low <= N <= high` и с заданной *модой* между этими границами. Границы *low* и *high* по умолчанию равны нулю и единице. Аргумент *mode* по умолчанию равен середине между границами, что даёт симметричное распределение.130131Новое в версии 2.6.132133#### `random.betavariate(alpha, beta)`134135Бета-распределение. Условия на параметры: `alpha > 0` и `beta > 0`. Возвращаемые значения находятся в диапазоне от 0 до 1.136137#### `random.expovariate(lambd)`138139Экспоненциальное распределение. *lambd* – это 1.0, делённая на желаемое среднее. Оно должно быть ненулевым. (Параметр мог бы называться «lambda», но это зарезервированное слово в Python.) Возвращаемые значения находятся в диапазоне от 0 до положительной бесконечности, если *lambd* положительно, и от отрицательной бесконечности до 0, если *lambd* отрицательно.140141#### `random.gammavariate(alpha, beta)`142143Гамма-распределение. (*Не* гамма-функция!) Условия на параметры: `alpha > 0` и `beta > 0`.144145Функция плотности распределения вероятности:146147```python148 x ** (alpha - 1) * math.exp(-x / beta)149pdf(x) = --------------------------------------150 math.gamma(alpha) * beta ** alpha151```152153#### `random.gauss(mu, sigma)`154155Гауссово распределение. *mu* – математическое ожидание, а *sigma* – стандартное отклонение. Эта функция немного быстрее, чем [`normalvariate()`](https://python-all.ru/2.7/library/random.html#random.normalvariate), определённая ниже.156157#### `random.lognormvariate(mu, sigma)`158159Логнормальное распределение. Если взять натуральный логарифм этого распределения, получится нормальное распределение со средним *mu* и стандартным отклонением *sigma*. *mu* может принимать любое значение, а *sigma* должна быть больше нуля.160161#### `random.normalvariate(mu, sigma)`162163Нормальное распределение. *mu* – это среднее, а *sigma* – стандартное отклонение.164165#### `random.vonmisesvariate(mu, kappa)`166167*mu* – это средний угол, выраженный в радианах от 0 до 2\**pi*, а *kappa* – параметр концентрации, который должен быть больше или равен нулю. Если *kappa* равен нулю, это распределение сводится к равномерному случайному углу в диапазоне от 0 до 2\**pi*.168169#### `random.paretovariate(alpha)`170171Распределение Парето. *alpha* – параметр формы.172173#### `random.weibullvariate(alpha, beta)`174175Распределение Вейбулла. *alpha* – параметр масштаба, а *beta* – параметр формы.176177Альтернативные генераторы:178179#### `class random.WichmannHill([seed])`180181Класс, реализующий алгоритм Вичмана-Хилла в качестве основного генератора. Имеет все те же методы, что и `Random`, а также метод [`whseed()`](https://python-all.ru/2.7/library/random.html#random.whseed), описанный ниже. Поскольку этот класс реализован на чистом Python, он не является потокобезопасным и может требовать блокировок между вызовами. Период генератора составляет 6 953 607 871 644, что достаточно мало, и требуется соблюдать осторожность, чтобы две независимые случайные последовательности не перекрывались.182183#### `random.whseed([x])`184185Это устарело, предоставляется для побитовой совместимости с версиями Python до 2.1. Подробнее см. [`seed()`](https://python-all.ru/2.7/library/random.html#random.seed). [`whseed()`](https://python-all.ru/2.7/library/random.html#random.whseed) не гарантирует, что разные целочисленные аргументы приводят к различным внутренним состояниям, и в общей сложности может давать не более чем около 2\*\*24 различных внутренних состояний.186187#### `class random.SystemRandom([seed])`188189Класс, использующий функцию [`os.urandom()`](https://python-all.ru/2.7/library/os.html#os.urandom) для генерации случайных чисел из источников, предоставляемых операционной системой. Доступен не на всех системах. Не полагается на состояние программного обеспечения, и последовательности не воспроизводимы. Соответственно, методы [`seed()`](https://python-all.ru/2.7/library/random.html#random.seed) и [`jumpahead()`](https://python-all.ru/2.7/library/random.html#random.jumpahead) не действуют и игнорируются. Методы [`getstate()`](https://python-all.ru/2.7/library/random.html#random.getstate) и [`setstate()`](https://python-all.ru/2.7/library/random.html#random.setstate) при вызове вызывают [`NotImplementedError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.NotImplementedError).190191Новое в версии 2.4.192193Примеры базового использования:194195```python196>>> random.random() # Случайный float x, 0.0 <= x < 1.01970.37444887175646646198>>> random.uniform(1, 10) # Случайный float x, 1.0 <= x < 10.01991.1800146073117523200>>> random.randint(1, 10) # Целое число от 1 до 10 включительно2017202>>> random.randrange(0, 101, 2) # Чётное целое число от 0 до 10020326204>>> random.choice('abcdefghij') # Выбрать случайный элемент205'c'206207>>> items = [1, 2, 3, 4, 5, 6, 7]208>>> random.shuffle(items)209>>> items210[7, 3, 2, 5, 6, 4, 1]211212>>> random.sample([1, 2, 3, 4, 5], 3) # Выбрать 3 элемента213[4, 1, 5]214```215216> **См. также**217>218> М. Мацумото и Т. Нисимура, «Вихрь Мерсенна: 623-мерно равномерно распределенный генератор псевдослучайных чисел», ACM Transactions on Modeling and Computer Simulation том 8, № 1, январь, стр. 3–30, 1998.219>220> Wichmann, B. A. & Hill, I. D., “Algorithm AS 183: An efficient and portable pseudo-random number generator”, Applied Statistics 31 (1982) 188-190.221>222> [Complementary-Multiply-with-Carry recipe](https://python-all.ru/2.7/library/random.html) для совместимого альтернативного генератора случайных чисел с длинным периодом и сравнительно простыми операциями обновления.223