Spec-Zone.ru › NumPy 1.20

Генерация случайных чисел (numpy.random)

Процедуры генерации случайных чисел в Numpy производят псевдослучайные числа, используя комбинацию BitGenerator для создания последовательностей и Generator для использования этих последовательностей для выборки из различных статистических распределений:

  • BitGenerators: Объекты, генерирующие случайные числа. Обычно это слова беззнаковых целых чисел, заполненные последовательностями из 32 или 64 случайных бит.
  • Generators: Объекты, преобразующие последовательности случайных бит из BitGenerator в последовательности чисел, которые следуют определённому вероятностному распределению (например, равномерному, нормальному или биномиальному) в заданном интервале.

Начиная с версии Numpy 1.17.0, Generator может быть инициализирован различными BitGenerators. Он предоставляет множество различных вероятностных распределений. См. NEP 19 для контекста обновлённых процедур генерации случайных чисел в Numpy. Предыдущие процедуры генерации случайных чисел RandomState по-прежнему доступны, но ограничены одним BitGenerator. См. Что нового или изменилось для полного списка улучшений и отличий от устаревшей версии Randomstate.

Для удобства и обратной совместимости методы отдельной инстанции RandomState импортированы в пространство имён numpy.random, см. Устаревшая генерация случайных чисел для полного списка.

Быстрый старт

Вызовите default_rng для получения новой инстанции Generator, затем вызовите её методы для получения выборок из различных распределений. По умолчанию Generator использует биты, предоставленные PCG64, которая обладает лучшими статистическими свойствами, чем устаревшая MT19937, используемая в RandomState.

# Do this (new version)
from numpy.random import default_rng
rng = default_rng()
vals = rng.standard_normal(10)
more_vals = rng.standard_normal(10)

# instead of this (legacy version)
from numpy import random
vals = random.standard_normal(10)
more_vals = random.standard_normal(10)

Generator может использоваться как замена для RandomState. Обе инстанции классов содержат внутреннюю инстанцию BitGenerator для предоставления потока бит, к которой можно получить доступ как gen.bit_generator. Из-за некоторых долгожданных изменений в API, устаревшие и совместимые методы были удалены из Generator

RandomState

Generator

Примечания

random_sample,

random

Совместимо с random.random

rand

randint,

integers

Добавить endpoint параметр

random_integers

tomaxint

удалено

Используйте integers(0, np.iinfo(np.int_).max, endpoint=False)

seed

удалено

Используйте SeedSequence.spawn

См. Что нового или изменилось для получения дополнительной информации.

Следующий код можно использовать для поддержки как RandomState , так и Generator, понимая, что интерфейсы немного отличаются

try:
    rg_integers = rg.integers
except AttributeError:
    rg_integers = rg.randint
a = rg_integers(1000)

Семена могут быть переданы любому из BitGenerators. Предоставленное значение смешивается с помощью SeedSequence для распространения возможной последовательности семян по более широкому диапазону начальных состояний BitGenerator. Здесь используется PCG64 и обернута в Generator.

from numpy.random import Generator, PCG64
rg = Generator(PCG64(12345))
rg.standard_normal()

Здесь мы используем default_rng для создания инстанции Generator для генерации случайного числа с плавающей точкой:

>>> import numpy as np
>>> rng = np.random.default_rng(12345)
>>> print(rng)
Generator(PCG64)
>>> rfloat = rng.random()
>>> rfloat
0.22733602246716966
>>> type(rfloat)
<class 'float'>

Здесь мы используем default_rng для создания инстанции Generator для генерации 3 случайных целых чисел в диапазоне от 0 (включительно) до 10 (исключительно):

>>> import numpy as np
>>> rng = np.random.default_rng(12345)
>>> rints = rng.integers(low=0, high=10, size=3)
>>> rints
array([6, 2, 7])
>>> type(rints[0])
<class 'numpy.int64'>

Введение

Новая инфраструктура использует другой подход к генерации случайных чисел по сравнению с объектом RandomState. Генерация случайных чисел разделена на два компонента: генератор бит и генератор случайных чисел.

У BitGenerator ограниченный набор задач. Он управляет состоянием и предоставляет функции для генерации случайных чисел с плавающей точкой и беззнаковых 32- и 64-битных значений.

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

Генератор случайных чисел Generator — это пользовательский объект, практически идентичный устаревшему RandomState. Он принимает в качестве аргумента экземпляр генератора бит. По умолчанию в настоящее время используется PCG64, но это может измениться в будущих версиях. Для удобства NumPy предоставляет функцию default_rng, чтобы скрыть эти детали:

>>> from numpy.random import default_rng
>>> rg = default_rng(12345)
>>> print(rg)
Generator(PCG64)
>>> print(rg.random())
0.22733602246716966

Также можно напрямую создать экземпляр Generator с экземпляром BitGenerator.

Чтобы использовать по умолчанию генератор бит PCG64, можно создать его напрямую и передать в Generator:

>>> from numpy.random import Generator, PCG64
>>> rg = Generator(PCG64(12345))
>>> print(rg)
Generator(PCG64)

Аналогично, чтобы использовать устаревший генератор бит MT19937 (не рекомендуется), можно создать его напрямую и передать в Generator:

>>> from numpy.random import Generator, MT19937
>>> rg = Generator(MT19937(12345))
>>> print(rg)
Generator(MT19937)

Что нового или изменилось

Предупреждение

Метод Бокса—Мюллера, используемый для генерации чисел нормального распределения в NumPy, больше не доступен в Generator. Невозможно воспроизвести точные случайные значения, используя Generator для нормального распределения или любого другого распределения, которое зависит от нормального, например, RandomState.gamma или RandomState.standard_t. Если вам необходимы битовые потоки, совместимые с предыдущими версиями, используйте RandomState.

  • Функции генератора, нормальная, экспоненциальная и гамма, используют методы Зиггурата с 256 шагами, которые в 2-10 раз быстрее, чем реализации NumPy «Box-Muller» или обратной функции распределения.
  • Дополнительный аргумент dtype, который принимает значения np.float32 или np.float64, для получения одно- или двойной точности равномерных случайных переменных для выбранных распределений
  • Дополнительный аргумент out, который позволяет заполнять существующие массивы для выбранных распределений
  • Все BitGenerators могут генерировать значения типа double, uint64 и uint32 через CTypes (PCG64.ctypes) и CFFI (PCG64.cffi). Это позволяет использовать генераторы битов в numba.
  • Генераторы битов могут быть использованы в последующих проектах через Cython.
  • Generator.integers теперь является стандартным способом генерации целых случайных чисел из дискретного равномерного распределения. Методы rand и randn доступны только через устаревший RandomState. Ключевое слово endpoint может быть использовано для указания открытых или закрытых интервалов. Это заменяет randint и устаревший random_integers.
  • Generator.random теперь является стандартным способом генерации случайных чисел с плавающей точкой, который заменяет RandomState.random_sample, RandomState.sample, и RandomState.ranf. Это согласуется с Python’s random.random.
  • Все BitGenerators в numpy используют SeedSequence для преобразования семян в инициализированные состояния.
  • Добавление ключевого аргумента axis к методам, таким как Generator.choice, Generator.permutation, и Generator.shuffle улучшает поддержку выборки и перемешивания многомерных массивов.

Полный список улучшений и отличий от традиционного Randomstate см. в разделе Что нового или отличается.

Параллельная генерация

Включенные генераторы могут использоваться в параллельных распределенных приложениях тремя способами:

  • Создание SeedSequence
  • Независимые потоки
  • Переход к состоянию BitGenerator

Концепции

  • Генератор случайных чисел
  • Устаревший генератор (RandomState)
  • Генераторы битов
  • Инициализация и энтропия

Функциональные возможности

  • Параллельные приложения
    • SeedSequence создание
    • Независимые потоки
    • Переход к состоянию BitGenerator
  • Многопоточная генерация
  • Что нового или отличается
  • Сравнение производительности
    • Рекомендация
    • Замеры времени
    • Производительность на разных операционных системах
  • C API для генерации случайных чисел
  • Примеры использования Numba, Cython, CFFI
    • Numba
    • Cython
    • CFFI
    • Новые генераторы битов
    • Примеры

Исходный код генератора и генераторов битов

Этот пакет был разработан независимо от NumPy и был интегрирован в версию 1.17.0. Исходный репозиторий находится по адресу https://github.com/bashtage/randomgen.

© 2005–2021 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.20/reference/random/index.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API