Управление Global Stream Используя RandStream

randrandnrandi, и 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

Смотрите также

|

Похожие темы