exponenta event banner

Управление глобальным потоком с помощью RandStream

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

Использовать rng для установки генератора случайных чисел в начальное значение по умолчанию (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

Измените начальное число генератора и алгоритм и создайте новый вектор случайной строки. Показать текущий глобальный поток, который 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

См. также

|

Связанные темы