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

random.md

363 строк · 16.5 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.1/library/random.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 9.6. `random` – Генерация псевдослучайных чисел89Этот модуль реализует генераторы псевдослучайных чисел для различных распределений.1011Для целых чисел – равномерный выбор из диапазона. Для последовательностей – равномерный выбор случайного элемента, функция для генерации случайной перестановки списка на месте и функция для случайной выборки без возвращения.1213На вещественной прямой есть функции для вычисления равномерного, нормального (гауссовского), логнормального, отрицательного экспоненциального, гамма и бета распределений. Для генерации распределений углов доступно распределение фон Мизеса.1415Почти все функции модуля зависят от базовой функции [`random()`](https://python-all.ru/3.1/library/random.html#random.random), которая генерирует случайное число с плавающей запятой, равномерно распределённое в полуоткрытом интервале \[0.0, 1.0). В Python в качестве основного генератора используется вихрь Мерсенна. Он генерирует числа с плавающей запятой точностью 53 бита и имеет период 2\*\*19937-1. Базовая реализация на C быстра и потокобезопасна. Вихрь Мерсенна – один из наиболее тщательно протестированных генераторов случайных чисел. Однако, будучи полностью детерминированным, он не подходит для всех целей и совершенно непригоден для криптографии.1617Функции, предоставляемые этим модулем, на самом деле являются привязанными методами скрытого экземпляра класса `random.Random`. Можно создать собственные экземпляры `Random`, чтобы получить генераторы, которые не разделяют состояние.1819Класс `Random` также можно наследовать, если требуется использовать другой базовый генератор собственной разработки: в этом случае переопределите методы [`random()`](https://python-all.ru/3.1/library/random.html#random.random), [`seed()`](https://python-all.ru/3.1/library/random.html#random.seed), [`getstate()`](https://python-all.ru/3.1/library/random.html#random.getstate) и [`setstate()`](https://python-all.ru/3.1/library/random.html#random.setstate). При необходимости новый генератор может предоставить метод [`getrandbits()`](https://python-all.ru/3.1/library/random.html#random.getrandbits) – это позволяет [`randrange()`](https://python-all.ru/3.1/library/random.html#random.randrange) выполнять выборки из произвольно больших диапазонов.2021Функции учёта:2223#### `random.seed([x])`2425Initialize the basic random number generator. Optional argument *x* can be any [*hashable*](https://python-all.ru/3.1/glossary.html#term-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()`](https://python-all.ru/3.1/library/os.html#os.urandom) function for details on availability).2627Если *x* не является `None` или целым числом, используется `hash(x)`. Если *x* – целое число, используется непосредственно *x*.2829#### `random.getstate()`3031Возвращает объект, фиксирующий текущее внутреннее состояние генератора. Этот объект можно передать в3233[`setstate()`](https://python-all.ru/3.1/library/random.html#random.setstate)3435для восстановления состояния.3637#### `random.setstate(state)`3839*state*4041должен быть получен из предыдущего вызова4243[`getstate()`](https://python-all.ru/3.1/library/random.html#random.getstate)4445, а4647[`setstate()`](https://python-all.ru/3.1/library/random.html#random.setstate)4849восстанавливает внутреннее состояние генератора до того, каким оно было на момент вызова5051[`setstate()`](https://python-all.ru/3.1/library/random.html#random.setstate)5253.5455#### `random.getrandbits(k)`5657Возвращает целое число Python с5859*k*6061случайными битами. Этот метод предоставляется генератором MersenneTwister, и некоторые другие генераторы также могут предоставлять его как опциональную часть API. При наличии6263[`getrandbits()`](https://python-all.ru/3.1/library/random.html#random.getrandbits)6465позволяет6667[`randrange()`](https://python-all.ru/3.1/library/random.html#random.randrange)6869работать с произвольно большими диапазонами.7071Функции для целых чисел:7273#### `random.randrange([start], stop[, step])`7475Возвращает случайно выбранный элемент из7677`range(start, stop, step)`7879. Это эквивалентно8081`choice(range(start, stop, step))`8283, но не создаёт объект range.8485#### `random.randint(a, b)`8687Возвращает случайное целое число8889*N*9091, такое что9293`a <= N <= b`9495. Псевдоним для9697`randrange(a, b+1)`9899.100101Функции для последовательностей:102103#### `random.choice(seq)`104105Возвращает случайный элемент из непустой последовательности106107*seq*108109. Если110111*seq*112113пуста, возбуждает114115[`IndexError`](https://python-all.ru/3.1/library/exceptions.html#IndexError)116117.118119#### `random.shuffle(x[, random])`120121Перемешивает последовательность *x* на месте. Необязательный аргумент *random* – функция без аргументов, возвращающая случайное число с плавающей запятой в \[0.0, 1.0); по умолчанию это функция [`random()`](https://python-all.ru/3.1/library/random.html#random.random).122123Обратите внимание, что даже для довольно малого `len(x)` общее число перестановок *x* больше периода большинства генераторов случайных чисел; это означает, что большинство перестановок длинной последовательности никогда не могут быть сгенерированы.124125#### `random.sample(population, k)`126127Возвращает список длины *k* из уникальных элементов, выбранных из последовательности population или множества. Используется для случайной выборки без возвращения.128129Возвращает новый список, содержащий элементы из population, не изменяя исходную population. Результирующий список упорядочен по порядку выбора, так что все подсписки также будут корректными случайными выборками. Это позволяет разделить победителей розыгрыша (выборку) на обладателей главного и второго призов (подсписки).130131Элементы population не обязаны быть [*хэшируемыми*](https://python-all.ru/3.1/glossary.html#term-hashable) или уникальными. Если population содержит повторения, то каждое вхождение является возможным элементом выборки.132133Чтобы выбрать выборку из диапазона целых чисел, используйте объект [`range()`](https://python-all.ru/3.1/library/functions.html#range) в качестве аргумента. Это особенно быстро и эффективно по памяти для выборки из большой популяции: `sample(range(10000000), 60)`.134135Следующие функции генерируют конкретные вещественные распределения. Имена параметров функций соответствуют переменным в уравнении распределения, как принято в математической практике; большинство этих уравнений можно найти в любом учебнике по статистике.136137#### `random.random()`138139Возвращает следующее случайное число с плавающей запятой в диапазоне \[0.0, 1.0).140141#### `random.uniform(a, b)`142143Возвращает случайное число с плавающей запятой *N* такое, что `a <= N <= b` для `a <= b` и `b <= N <= a` для `b < a`.144145Конечное значение `b` может входить или не входить в диапазон в зависимости от округления чисел с плавающей запятой в уравнении `a + (b-a) * random()`.146147#### `random.triangular(low, high, mode)`148149Возвращает случайное число с плавающей запятой150151*N*152153такое, что154155`low <= N <= high`156157и с заданной158159*mode*160161между этими границами. Границы162163*low*164165и166167*high*168169по умолчанию равны нулю и единице. Аргумент170171*mode*172173по умолчанию равен середине между границами, что даёт симметричное распределение.174175#### `random.betavariate(alpha, beta)`176177Бета-распределение. Условия на параметры:178179`alpha > 0`180181и182183`beta > 0`184185. Возвращаемые значения находятся в диапазоне от 0 до 1.186187#### `random.expovariate(lambd)`188189Экспоненциальное распределение.190191*lambd*192193– это 1.0, делённая на желаемое среднее. Оно должно быть ненулевым. (Параметр мог бы называться «lambda», но это зарезервированное слово в Python.) Возвращаемые значения находятся в диапазоне от 0 до положительной бесконечности, если194195*lambd*196197положительно, и от отрицательной бесконечности до 0, если198199*lambd*200201отрицательно.202203#### `random.gammavariate(alpha, beta)`204205Гамма-распределение. (206207*Не*208209гамма-функция!) Условия на параметры:210211`alpha > 0`212213и214215`beta > 0`216217.218219#### `random.gauss(mu, sigma)`220221Гауссово распределение.222223*mu*224225– это среднее, а226227*sigma*228229– это стандартное отклонение. Эта функция немного быстрее, чем230231[`normalvariate()`](https://python-all.ru/3.1/library/random.html#random.normalvariate)232233, определённая ниже.234235#### `random.lognormvariate(mu, sigma)`236237Логнормальное распределение. Если взять натуральный логарифм этого распределения, получится нормальное распределение со средним238239*mu*240241и стандартным отклонением242243*sigma*244245.246247*mu*248249может принимать любое значение, а250251*sigma*252253должна быть больше нуля.254255#### `random.normalvariate(mu, sigma)`256257Нормальное распределение.258259*mu*260261– это среднее, а262263*sigma*264265– стандартное отклонение.266267#### `random.vonmisesvariate(mu, kappa)`268269*mu*270271– это средний угол, выраженный в радианах от 0 до 2\*272273*pi*274275, а276277*kappa*278279– параметр концентрации, который должен быть больше или равен нулю. Если280281*kappa*282283равен нулю, это распределение сводится к равномерному случайному углу в диапазоне от 0 до 2\*284285*pi*286287.288289#### `random.paretovariate(alpha)`290291Распределение Парето.292293*alpha*294295– параметр формы.296297#### `random.weibullvariate(alpha, beta)`298299Распределение Вейбулла.300301*alpha*302303– параметр масштаба, а304305*beta*306307– параметр формы.308309Альтернативные генераторы:310311#### `class random.SystemRandom([seed])`312313Класс, использующий функцию314315[`os.urandom()`](https://python-all.ru/3.1/library/os.html#os.urandom)316317для генерации случайных чисел из источников, предоставляемых операционной системой. Доступен не на всех системах. Не зависит от состояния программного обеспечения, и последовательности не воспроизводимы. Соответственно, метод318319[`seed()`](https://python-all.ru/3.1/library/random.html#random.seed)320321не имеет эффекта и игнорируется. Методы322323[`getstate()`](https://python-all.ru/3.1/library/random.html#random.getstate)324325и326327[`setstate()`](https://python-all.ru/3.1/library/random.html#random.setstate)328329при вызове вызывают330331[`NotImplementedError`](https://python-all.ru/3.1/library/exceptions.html#NotImplementedError)332333.334335Примеры базового использования:336337```python338>>> random.random()        # Случайный float x, 0.0 <= x < 1.03390.37444887175646646340>>> random.uniform(1, 10)  # Случайный float x, 1.0 <= x < 10.03411.1800146073117523342>>> random.randint(1, 10)  # Целое число от 1 до 10 включительно3437344>>> random.randrange(0, 101, 2)  # Чётное целое число от 0 до 10034526346>>> random.choice('abcdefghij')  # Выбрать случайный элемент347'c'348349>>> items = [1, 2, 3, 4, 5, 6, 7]350>>> random.shuffle(items)351>>> items352[7, 3, 2, 5, 6, 4, 1]353354>>> random.sample([1, 2, 3, 4, 5],  3)  # Выбрать 3 элемента355[4, 1, 5]356```357358> **См. также**359>360> 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.361>362> [Complementary-Multiply-with-Carry recipe](https://python-all.ru/3.1/library/random.html) для совместимого альтернативного генератора случайных чисел с длинным периодом и сравнительно простыми операциями обновления.363