RandStream rand, randn, randi, и randperm функции извлекают случайные числа из основного потока случайных чисел, называемого глобальным потоком. Глобальный поток - это RandStream объект. Простым способом управления глобальным потоком является использование rng функция. Для более полного контроля, RandStream класс позволяет создать отдельный поток из глобального потока, получить дескриптор глобального потока и управлять генерацией случайных чисел.
Использовать rng для установки генератора случайных чисел в начальное значение по умолчанию (0) и алгоритм (Мерсенн Твистер). Сохраните настройки генератора.
rng('default')
s = rngs = 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