Создание и управление потоком случайных чисел

Класс RandStream позволяет вам создавать поток случайных чисел. Это полезно по нескольким причинам. Например, вы можете хотеть сгенерировать случайные значения, не влияя на состояние глобального потока. Вы можете хотеть отдельные источники случайности в моделировании. Или вы, возможно, должны использовать различный алгоритм генератора, чем одно использование MATLAB при запуске. С конструктором RandStream можно создать собственный поток, установить перезаписываемые свойства и использовать его, чтобы сгенерировать случайные числа. Можно управлять потоком, вы создаете тот же способ, которым вы управляете глобальным потоком. Можно даже заменить глобальный поток на поток, который вы создаете.

Чтобы создать поток, используйте конструктора RandStream.

myStream=RandStream('mlfg6331_64');
rand(myStream,1,5)

ans =

    0.6530    0.8147    0.7167    0.8615    0.0764

Случайный поток myStream действует отдельно от глобального потока. Функции rand, randn и randi продолжат чертить от глобального потока и не будут влиять на результаты методов RandStream, rand, randn и randi применились к myStream.

Можно сделать myStream глобальным потоком с помощью метода RandStream.setGlobalStream.

RandStream.setGlobalStream(myStream)
RandStream.getGlobalStream

ans = 

mlfg6331_64 random stream (current global stream)
             Seed: 0
  NormalTransform: Ziggurat

RandStream.getGlobalStream==myStream

ans =

     1

Подпотоки

Можно хотеть возвратиться к предыдущей части моделирования. Случайным потоком можно управлять при наличии, это переходит к фиксированным контрольным точкам, названным подпотоками. Свойство Substream позволяет вам переходить назад и вперед среди нескольких подпотоков. Чтобы использовать свойство Substream, создайте поток с помощью генератора, который поддерживает подпотоки. (См. Выбор Random Number Generator для списка алгоритмов генератора и их свойств.)

stream=RandStream('mlfg6331_64');
RandStream.setGlobalStream(stream)

Начальное значение Substream равняется 1.

stream.Substream

ans =

     1

Подпотоки полезны в последовательном вычислении. Подпотоки могут воссоздать все или часть моделирования путем возврата к конкретной контрольной точке в потоке. Например, они могут использоваться в циклах.

for i=1:5
    stream.Substream=i;
    rand(1,i)
end

ans =
    0.6530

ans =
    0.3364    0.8265

ans =
    0.9539    0.6446    0.4913

ans =
    0.0244    0.5134    0.6305    0.6534

ans =
    0.3323    0.9296    0.5767    0.1233    0.6934

Каждый из этих подпотоков может воспроизвести свою итерацию цикла. Например, можно возвратиться к 5-му подпотоку. Результат возвратит те же значения как 5-й вывод выше.

stream.Substream=5;
rand(1,5)

ans =

    0.3323    0.9296    0.5767    0.1233    0.6934

Выбор генератора случайных чисел

MATLAB предлагает несколько опций алгоритма генератора. Следующая таблица обобщает ключевые свойства доступных алгоритмов генератора, и ключевые слова раньше создавали их. Чтобы возвратить список всех доступных алгоритмов генератора, используйте метод RandStream.list.

Ключевое словоГенераторНесколько передают потоком и подпотоковая поддержкаАппроксимированный период в полной точности
mt19937arВихрь Мерсенна (используемый потоком по умолчанию при запуске MATLAB)Нет219937-1
dsfmt19937SIMD-ориентированный быстрый Вихрь Мерсенна Нет219937-1
mcg16807Мультипликативный congruential генераторНет231-2
mlfg6331_64Мультипликативный изолированный генератор ФибоначчиДа2124 (251 поток длины 272)
mrg32k3aОбъединенный несколько рекурсивный генераторДа2191 (263 потока длины 2127)
philox4x32_10Philox 4x32 генератор с 10 раундамиДа2193 (264 потока длины 2129)
threefry4x64_20Threefry 4x64 генератор с 20 раундамиДа2514 (2 256 потоков длины 2258)
shr3congГенератор сдвигового регистра суммирован с линейным congruential генераторомНет264
swb2712Измененный вычитают с, одалживают генераторНет21492

Генераторы mcg16807, shr3cong и swb2712 предусматривают назад совместимость с более ранними версиями MATLAB. mt19937ar и dsfmt19937 разработаны, в основном, для последовательных приложений. Остающиеся генераторы оказывают явную поддержку для параллельной генерации случайных чисел.

В зависимости от приложения некоторые генераторы могут быть более быстрыми или возвращаемыми значениями с большей точностью. Все генераторы псевдослучайного числа основаны на детерминированных алгоритмах, и все провалят достаточно определенный статистический тест на случайность. Один способ проверить результаты симуляции Монте-Карло состоит в том, чтобы повторно выполнить моделирование с двумя или больше различными алгоритмами генератора, и выбор программного обеспечения MATLAB генераторов предоставляет вам средние значения, чтобы сделать это. Несмотря на то, что маловероятно, что ваши результаты будут отличаться больше, чем Монте-Карло, выбирающим ошибку при использовании различных генераторов, существуют примеры в литературе, где этот вид валидации поднял дефекты в конкретном алгоритме генератора (см. [13] для примера).

Алгоритмы генератора

mt19937ar

У Вихря Мерсенна, как описано в [11], есть период 219937−1 и каждый U (0,1), стоимость создается с помощью двух 32-битных целых чисел. Возможные значения являются множителями 2−53 в интервале (0,1). Этот генератор не поддерживает несколько потоков или подпотоков. Алгоритм randn, используемый по умолчанию для потоков mt19937ar, является алгоритмом зиггурата [7], но с генератором mt19937ar внизу. Примечание: Этот генератор идентичен тому, используемому функцией rand, начинающейся в MATLAB Version 7, активированном rand('twister',s).

dsfmt19937

Двойная точность, SIMD-ориентированная на Быстрый Вихрь Мерсенна, как описано в [12], является быстрым внедрением Алгоритма Вихря Мерсенна. Период 219937−1, и возможные значения являются множителями 2−52 в интервале (0,1). Генератор производит значения двойной точности в [1,2), исходно, которые преобразовываются, чтобы создать U (0,1) значения. Этот генератор не поддерживает несколько потоков или подпотоков.

mcg16807

32-битный мультипликативный congruential генератор, как описано в [14], со множителем a=75, m=231−1 по модулю. Этот генератор имеет период 231−2 и не поддерживает несколько потоков или подпотоков. Каждая стоимость U(0,1) создается с помощью единственного 32-битного целого числа от генератора; возможные значения являются всеми множителями (231−1) −1 строго в интервале (0,1). Алгоритм randn, используемый по умолчанию для потоков mcg16807, является полярным алгоритмом (описанный в [1]). Примечание: Этот генератор идентичен тому, используемому, начинаясь в MATLAB Version 4 и rand и функциями randn, активированное использование rand('seed',s) или randn('seed',s).

mlfg6331_64

64-битный мультипликативный изолированный генератор Фибоначчи, как описано в [10], с задержками l=63, k=31. Этот генератор подобен MLFG, реализованному в пакете SPRNG. Это имеет период приблизительно 2 124. Это поддерживает до 261 параллельного потока через параметризацию, и 251 подпоток каждая длина 272. Каждая стоимость U(0,1) создается с помощью одного 64-битного целого числа от генератора; возможные значения являются всеми множителями строго в интервале (0,1). Алгоритм randn, используемый по умолчанию для потоков mlfg6331_64, является алгоритмом зиггурата [7], но с генератором mlfg6331_64 внизу.

mrg32k3a

32-битное объединило несколько рекурсивный генератор, как описано в [2]. Этот генератор подобен CMRG, реализованному в пакете RngStreams. Это имеет период 2 191 и поддерживает до 263 параллельных потоков через разделение последовательности, каждую длину 2127. Это также поддерживает 251 подпоток, каждую длину 276. Каждая стоимость U(0,1) создается с помощью двух 32-битных целых чисел от генератора; возможные значения являются множителями 2−53 строго в интервале (0,1). Алгоритм randn, используемый по умолчанию для потоков mrg32k3a, является алгоритмом зиггурата [7], но с генератором mrg32k3a внизу.

philox4x32_10

4x32 генератор с 10 раундами, как описано в [15]. Этот генератор использует сеть Feistel и целочисленное умножение, и специально предназначен для высокой производительности в очень параллельных системах, таких как GPU. Это имеет период 2 193 (264 потока длины 2129).

threefry4x64_20

4x64 генератор с 20 раундами, как описано в [15]. Этот генератор является некриптографической адаптацией блочного шифра Threefish от Хеш-функции Мотка пряжи. Это имеет период 2 514 (2 256 потоков длины 2258).

shr3cong

Генератор сдвигового регистра Марсэглии SHR3, суммированный с линейным congruential генератором со множителем a=69069, слагаемое b=1234567, и модуль 2−32. SHR3 является генератором с 3 сдвиговыми регистрами, заданным как u=u (I+L13)(I+R17)(I+L5), где я - единичный оператор, L является левым оператором смещения, и R является оператором сдвига вправо. Объединенный генератор (часть SHR3 описана в [7]) имеет период приблизительно 264. Этот генератор не поддерживает несколько потоков или подпотоков. Каждый U (0,1) значение создается с помощью одного 32-битного целого числа из генератора; возможные значения являются всеми множителями 2−32 строго в интервале (0,1). Алгоритм randn, используемый по умолчанию для потоков shr3cong, является более ранней формой алгоритма зиггурата [9], но с генератором shr3cong внизу. Этот генератор идентичен тому, используемому функцией randn, начинающейся в MATLAB Version 5, активированное использование randn('state',s).

Примечание

Генератор SHR3, используемый в [6] (1999), отличается от того, используемого в [7] (2000). MATLAB использует новую версию генератора, представленного в [7].

swb2712

Измененный генератор Subtract-Borrow, как описано в [8]. Этот генератор подобен дополнению, изолировал генератор Фибоначчи с задержками 27 и 12, но изменяется, чтобы иметь намного более длинный период приблизительно 21 492. Генератор работает исходно в двойной точности, чтобы создать U (0,1) значения, и все значения в открытом интервале (0,1) возможны. Алгоритм randn, используемый по умолчанию для потоков swb2712, является алгоритмом зиггурата [7], но с генератором swb2712 внизу. Примечание: Этот генератор идентичен тому, используемому функцией rand, начинающейся в MATLAB Version 5, активированное использование rand('state',s).

Алгоритмы преобразования

Inversion

Вычисляет нормальную случайную варьируемую величину путем применения стандартной нормальной обратной кумулятивной функции распределения к универсальной случайной варьируемой величине. Точно одно универсальное значение используется на нормальное значение.

Полярный

Полярный алгоритм отклонения, как описано в [1]. Приблизительно 1,27 универсальных значения используются на нормальное значение в среднем.

Ziggurat

Алгоритм зиггурата, как описано в [7]. Приблизительно 2,02 универсальных значения используются на нормальное значение в среднем.

Ссылки

[1] Devroye, L. Неоднородная генерация случайных переменных, Springer-Verlag, 1986.

[2] L’Ecuyer, P. “Хорошие наборы параметра для объединенного несколько рекурсивных генераторов случайных чисел”, исследование операций, 47 (1): 159–164. 1999.

[3] L'Ecuyer, P. и С. Куте. “Реализовывая пакет случайных чисел с разделяющими средствами”, транзакции ACM на математическом программном обеспечении, 17: 98–111. 1991.

[4] L'Ecuyer, P. и Р. Симард. “TestU01: библиотека C для эмпирического тестирования генераторов случайных чисел”, транзакции ACM на математическом программном обеспечении, 33 (4): статья 22. 2007.

[5] L'Ecuyer, P., R. Simard, Э. J. Чен и В. D. Келтон. “Возраженный - ориентированный пакет случайных чисел со многими длинными потоками и подпотоками”. Исследование операций, 50 (6):1073–1075. 2002.

[6] Marsaglia, G. “Случайные числа для C: ЗАКАНЧИВАНИЕ?” Регистрация Usenet на sci.stat.math. 1999. Доступный онлайн в https://groups.google.com/group/sci.crypt/browse_thread/
thread/ca8682a4658a124d/
.

[7] Марсэглия Г. и В. W. Цанг. “Метод зиггурата для генерации случайных переменных”. Журнал Статистического программного обеспечения, 5:1–7. 2000. Доступный онлайн в https://www.jstatsoft.org/v05/i08.

[8] Marsaglia, G. и A. Заман. “Новый класс генераторов случайных чисел”. Летопись Прикладной Вероятности 1 (3):462–480. 1991.

[9] Marsaglia, G. и В. W. Цанг. “Быстрый, легко реализованный метод для выборки от уменьшения или симметричных одномодовых функций плотности”. SIAM J.Sci. Закон Comput. 5 (2):349–359. 1984.

[10] Масканьи, M. и А. Сринивасан. “Параметризовав параллельные мультипликативные изолированные-Fibonacci генераторы”. Параллельные вычисления, 30: 899–916. 2004.

[11] Мацумото, M. и Т. Нисимура. “Вихрь Мерсенна: 623 - размерностно универсальный генератор псевдослучайного числа Equidistributed”. Транзакции ACM при моделировании и компьютерном моделировании, 8 (1):3–30. 1998.

[12] Мацумото, M. и М. Саито. “PRNG, специализированный в числах двойной точности с плавающей точкой Используя аффинный переход”. Методы Монте-Карло и квазиметоды Монте-Карло 2008, 10.1007/978-3-642-04107-5_38. 2009.

[13] Moler, C.B. Числовое Вычисление с MATLAB. SIAM, 2004. Доступный онлайн в https://www.mathworks.com/moler

[14] Припаркуйтесь, S.K. и Миллер K.W.. “Генераторы случайных чисел: хорошие единицы трудно найти”. Коммуникации ACM, 31 (10):1192–1201. 1998.

[15] Лосось, Дж. K. M. A. Мораес, Р. O. Дрор и Д. E. Шоу. "Параллельные Случайные числа: Столь же Легкий как 1, 2, 3". В Продолжениях Международной конференции для Высокоэффективного Вычисления, Организации сети, Устройства хранения данных и Анализа (SC11). Нью-Йорк, Нью-Йорк: ACM, 2011.

Была ли эта тема полезной?