Управление Global Stream с помощью RandStream

The rand, randn, randi, и randperm функции берут случайные числа из базового потока случайных чисел, называемого глобальным потоком. Глобальный поток является RandStream объект. Простой способ управления глобальным потоком - использовать rng функция. Для более комплексного контроля, RandStream класс позволяет вам создать отдельный поток из глобального потока, получить указатель на глобальный поток и управлять генерацией случайных чисел.

Использование rng для установки генератора случайных чисел на seed по умолчанию (0) и алгоритм ( Вихрь Мерсенна). Сохраните настройки генератора.

rng('default')
s = rng
s = struct with fields:
     Type: 'twister'
     Seed: 0
    State: [625x1 uint32]

Создайте вектор-строку 1 на 6 равномерно распределенных случайных значений между 0 и 1.

x = rand(1,6)
x = 1×6

    0.8147    0.9058    0.1270    0.9134    0.6324    0.0975

Использование RandStream.getGlobalStream чтобы вернуть указатель в глобальный поток, то есть текущий глобальный поток, который rand генерирует случайные числа от. Если вы используете RandStream.getGlobalStream чтобы получить указатель на глобальный поток, можно увидеть изменения, внесенные в глобальный поток с помощью rng.

globalStream = RandStream.getGlobalStream
globalStream = 
mt19937ar random stream (current global stream)
             Seed: 0
  NormalTransform: Ziggurat

Измените seed и алгоритм генератора и создайте новый случайный вектор-строку. Покажите текущий глобальный поток, который rand генерирует случайные числа от.

rng(1,'philox')
xnew = rand(1,6)
xnew = 1×6

    0.5361    0.2319    0.7753    0.2390    0.0036    0.5262

globalStream = RandStream.getGlobalStream
globalStream = 
philox4x32_10 random stream (current global stream)
             Seed: 1
  NormalTransform: Inversion

Затем восстановите исходные настройки генератора и создайте случайный вектор. Результат соответствует исходному вектору-строке x создан с генератором по умолчанию.

rng(s)
xold = rand(1,6)
xold = 1×6

    0.8147    0.9058    0.1270    0.9134    0.6324    0.0975

По умолчанию функции генерации случайных чисел, такие как rand, используйте глобальный поток случайных чисел. Чтобы задать другой поток, создайте другую RandStream объект. Передайте его как первый входной параметр, чтобы rand. Для примера создайте вектор 1 на 6 случайных чисел с помощью SIMD-ориентированного быстрого Вихря Мерсенна.

myStream = RandStream('dsfmt19937')
myStream = 
dsfmt19937 random stream
             Seed: 0
  NormalTransform: Ziggurat
r = rand(myStream,1,6)
r = 1×6

    0.0306    0.2131    0.2990    0.3811    0.8635    0.1334

Когда вы вызываете rand функция со myStream в качестве первого входного параметра он рисует числа из myStream и не влияет на результаты глобального потока.

Если вы хотите задать myStream в качестве глобального потока можно использовать RandStream.setGlobalStream функция объекта.

RandStream.setGlobalStream(myStream)
globalStream = RandStream.getGlobalStream
globalStream = 
dsfmt19937 random stream (current global stream)
             Seed: 0
  NormalTransform: Ziggurat

Во многих случаях rng функция - это все, что вам нужно для управления глобальным потоком, но RandStream класс позволяет управлять некоторыми расширенными функциями, такими как выбор алгоритма, используемого для нормальных случайных значений.

Для примера создайте RandStream и задайте алгоритм преобразования, чтобы сгенерировать нормально распределенные псевдослучайные значения при использовании randn. Сгенерируйте нормально распределенные псевдослучайные значения, используя Polar алгоритм преобразования, вместо алгоритма по умолчанию Ziggurat алгоритм преобразования.

myStream = RandStream('mt19937ar','NormalTransform','Polar')
myStream = 
mt19937ar random stream
             Seed: 0
  NormalTransform: Polar

Задайте myStream как глобальный поток. Создайте 6 случайных чисел с нормальным распределением из глобального потока.

RandStream.setGlobalStream(myStream)
randn(1,6)
ans = 1×6

    0.2543   -0.7733   -1.7416    0.3686    0.5965   -0.0191

См. также

|

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте