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 |
dsfmt19937 | SIMD-ориентированный быстрый Вихрь Мерсенна | Нет | 219937-1 |
mcg16807 | Мультипликативный congruential генератор | Нет | 231-2 |
mlfg6331_64 | Мультипликативный изолированный генератор Фибоначчи | Да | 2124 (251 поток длины 272) |
mrg32k3a | Объединенный несколько рекурсивный генератор | Да | 2191 (263 потока длины 2127) |
philox4x32_10 | Philox 4x32 генератор с 10 раундами | Да | 2193 (264 потока длины 2129) |
threefry4x64_20 | Threefry 4x64 генератор с 20 раундами | Да | 2514 (2 256 потоков длины 2258) |
shr3cong | Генератор сдвигового регистра суммирован с линейным congruential генератором | Нет | 264 |
swb2712 | Измененный вычитают с, одалживают генератор | Нет | 21492 |
Генераторы mcg16807
, shr3cong
, и swb2712
предусмотрите назад совместимость с более ранними версиями MATLAB. mt19937ar
и dsfmt19937
спроектированы, в основном, для последовательных приложений. Остающиеся генераторы оказывают явную поддержку для параллельной генерации случайных чисел.
В зависимости от приложения некоторые генераторы могут быть более быстрыми или возвращаемыми значениями с большей точностью. Все генераторы псевдослучайного числа основаны на детерминированных алгоритмах, и все провалят достаточно определенный статистический тест на случайность. Один способ проверять результаты симуляции Монте-Карло состоит в том, чтобы повторно выполнить симуляцию с двумя или больше различными алгоритмами генератора, и выбор программного обеспечения MATLAB генераторов предоставляет вам средние значения, чтобы сделать это. Несмотря на то, что маловероятно, что ваши результаты будут отличаться больше, чем Монте-Карло, производящим ошибку при использовании различных генераторов, существуют примеры в литературе, где этот вид валидации поднял дефекты в конкретном алгоритме генератора (см. [13] для примера).
mt19937ar
У Вихря Мерсенна, как описано в [11], есть период и каждый U (0,1) значение создается с помощью двух 32-битных целых чисел. Возможные значения являются множителями в интервале (0,1). Этот генератор не поддерживает несколько потоков или подпотоков. randn
алгоритм, используемый по умолчанию в mt19937ar
потоки являются алгоритмом зиггурата [7], но с mt19937ar
генератор внизу. Примечание: Этот генератор идентичен тому, используемому rand
функция, начинающаяся в MATLAB Version 7, активированном rand('twister',s)
.
dsfmt19937
Двойная точность, SIMD-ориентированная на Быстрый Вихрь Мерсенна, как описано в [12], является быстрым внедрением Алгоритма Вихря Мерсенна. Период и возможные значения являются множителями в интервале (0,1). Генератор производит значения двойной точности в [1,2), исходно, которые преобразовываются, чтобы создать U (0,1) значения. Этот генератор не поддерживает несколько потоков или подпотоков.
mcg16807
32-битный мультипликативный congruential генератор, как описано в [14], со множителем , по модулю . Этот генератор имеет период и не поддерживает несколько потоков или подпотоков. Каждый U(0,1)
стоимость создается с помощью одного 32-битного целого числа от генератора; возможные значения являются всеми множителями строго в интервале (0,1)
. randn
алгоритм, используемый по умолчанию в mcg16807
потоки являются полярным алгоритмом (описанный в [1]). Примечание: Этот генератор идентичен тому, используемому, начиная в MATLAB Version 4 обоими rand
и randn
функции, активированное использование rand('seed',s)
или randn('seed',s)
.
mlfg6331_64
64-битный мультипликативный изолированный генератор Фибоначчи, как описано в [10], с задержками , . Этот генератор похож на MLFG, реализованный в пакете SPRNG. Это имеет период приблизительно . Это поддерживает до параллельные потоки, через параметризацию, и подпотоки каждая длина . Каждый U(0,1)
стоимость создается с помощью одного 64-битного целого числа от генератора; возможные значения являются всеми множителями строго в интервале (0,1). randn
алгоритм, используемый по умолчанию в mlfg6331_64
потоки являются алгоритмом зиггурата [7], но с mlfg6331_64
генератор внизу.
mrg32k3a
32-битное объединило несколько рекурсивный генератор, как описано в [2]. Этот генератор похож на CMRG, реализованный в пакете RngStreams. Это имеет период и поддержки до параллельные потоки через разделение последовательности, каждую длину . Это также поддерживает подпотоки, каждая длина . Каждый U(0,1)
стоимость создается с помощью двух 32-битных целых чисел от генератора; возможные значения являются множителями строго в интервале (0,1). randn
алгоритм, используемый по умолчанию в mrg32k3a
потоки являются алгоритмом зиггурата [7], но с mrg32k3a
генератор внизу.
philox4x32_10
4x32 генератор с 10 раундами как описано в [15]. Этот генератор использует сеть Feistel и целочисленное умножение, и специально предназначен для высокой производительности в очень параллельных системах, таких как графические процессоры. Это имеет период 2 193 (264 потока длины 2129).
threefry4x64_20
4x64 генератор с 20 раундами как описано в [15]. Этот генератор является некриптографической адаптацией блочного шифра Threefish от Хеш-функции Мотка пряжи. Это имеет период 2 514 (2 256 потоков длины 2258).
shr3cong
Генератор сдвигового регистра Марсэглии SHR3 суммирован с линейным congruential генератором со множителем , слагаемое , и модуль . SHR3 является генератором с 3 сдвиговыми регистрами, заданным как , где единичный оператор, левый оператор смещения, и R является оператором сдвига вправо. Объединенный генератор (часть SHR3 описана в [7]) имеет период приблизительно . Этот генератор не поддерживает несколько потоков или подпотоков. Каждый U (0,1) значение создается с помощью одного 32-битного целого числа из генератора; возможные значения являются всеми множителями строго в интервале (0,1). randn
алгоритм, используемый по умолчанию в shr3cong
потоки являются более ранней формой алгоритма зиггурата [9], но с shr3cong
генератор внизу. Этот генератор идентичен тому, используемому randn
функция, начинающаяся в MATLAB Version 5, активированное использование randn('state',s)
.
swb2712
Модифицированный генератор Subtract-Borrow, как описано в [8]. Этот генератор похож на дополнение, изолировал генератор Фибоначчи с задержками 27 и 12, но изменяется, чтобы иметь намного более длинный период приблизительно . Генератор работает исходно в двойной точности, чтобы создать U (0,1) значения, и все значения в открытом интервале (0,1) возможны. randn
алгоритм, используемый по умолчанию в swb2712
потоки являются алгоритмом зиггурата [7], но с swb2712
генератор внизу. Примечание: Этот генератор идентичен тому, используемому функцией rand, начинающейся в MATLAB Version 5, активированное использование rand('state',s)
.
Inversion
Вычисляет нормальную случайную варьируемую величину путем применения стандартной нормальной обратной кумулятивной функции распределения к универсальной случайной варьируемой величине. Точно одно универсальное значение используется на нормальное значение.
Polar
Полярный алгоритм отклонения, как описано в [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., Р. Симард, Э. Дж. Чен и В. Д. Келтон. “Возраженный - ориентированный пакет случайных чисел со многими длинными потоками и подпотоками”. Исследование операций, 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] Марсэглия Г. и В. В. Цанг. “Метод зиггурата для генерации случайных переменных”. Журнал Статистического программного обеспечения, 5:1–7. 2000. Доступный онлайн в https://www.jstatsoft.org/v05/i08
.
[8] Marsaglia, G. и A. Заман. “Новый класс генераторов случайных чисел”. Летопись Прикладной Вероятности 1 (3):462–480. 1991.
[9] Marsaglia, G. и В. В. Цанг. “Быстрый, легко реализованный метод для выборки от уменьшения или симметричных одномодовых функций плотности”. SIAM J.Sci.Stat.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, К.Б. Нумерикэл Компьютинг с MATLAB. SIAM, 2004. Доступный онлайн в https://www.mathworks.com/moler
[14] Припаркуйтесь, S.K., и К.В. Миллер. “Генераторы случайных чисел: хорошие единицы трудно найти”. Коммуникации ACM, 31 (10):1192–1201. 1998.
[15] Лосось, J. K. М. А. Мораес, Р. О. Дрор и Д. Э. Шоу. "Параллельные случайные числа: столь же легкий как 1, 2, 3". В продолжениях международной конференции для высокоэффективного вычисления, организации сети, устройства хранения данных и анализа (SC11). Нью-Йорк, Нью-Йорк: ACM, 2011.