Класс 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], со множителем ,