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