RandStreamThe rand, randn, randi, и randperm функции берут случайные числа из базового потока случайных чисел, называемого глобальным потоком. Глобальный поток является RandStream объект. Простой способ управления глобальным потоком - использовать rng функция. Для более комплексного контроля, RandStream класс позволяет вам создать отдельный поток из глобального потока, получить указатель на глобальный поток и управлять генерацией случайных чисел.
Использование rng для установки генератора случайных чисел на seed по умолчанию (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
Измените 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