RandStream.create

Создайте статистически независимые потоки случайных чисел

Описание

s = RandStream.create(gentype) создает один случайный поток, который использует универсальный алгоритм генератора псевдослучайного числа, заданный gentype. RandStream.list возвращает все возможные значения для gentype, или смотрите Выбор Random Number Generator для получения дополнительной информации об алгоритмах генератора. RandStream функция является более краткой альтернативой, когда необходимо создать единый поток.

пример

[s1,s2,...] = RandStream.create(gentype,'NumStreams',n) создает n потоки случайных чисел. Потоки независимы в псевдослучайном смысле. Потоки не обязательно независимы от потоков, созданных в других случаях.

Примечание

Не все типы генератора поддерживают несколько потоков. Используйте любого мультипликативный изолированный генератор Фибоначчи ('mlfg6331_64') или объединенное несколько рекурсивный генератор ('mrg32k3a') создать несколько потоков.

пример

[___] = RandStream.create(gentype,Name,Value) создание средств управления потока с помощью одного или нескольких Name,Value пары.

Примеры

свернуть все

Создайте три независимых потока. Сгенерируйте случайные числа от каждого потока. Проверяйте корреляции между ними. Корреляции между различными потоками не точно 0, потому что они вычисляются от выборки распределения.

[s1,s2,s3] = RandStream.create('mrg32k3a','NumStreams',3);
r1 = rand(s1,100000,1); 
r2 = rand(s2,100000,1); 
r3 = rand(s3,100000,1);
corrcoef([r1,r2,r3])
ans = 3×3

    1.0000    0.0016   -0.0019
    0.0016    1.0000   -0.0012
   -0.0019   -0.0012    1.0000

Можно также создать один поток из трех независимых потоков и определять его как глобальный поток.

s2 = RandStream.create('mrg32k3a','NumStreams',3,'StreamIndices',2);
RandStream.setGlobalStream(s2);

Сгенерируйте случайные числа от глобального потока.

r = rand(100000,1);

Создайте три взаимно независимых потока, чтобы симулировать одномерные случайные обходы с помощью метода RandStream.create.

[s1,s2,s3] = RandStream.create('mrg32k3a','NumStreams',3);

Сгенерируйте случайный обход от первого потока. Во-первых, установите его как глобальный поток. Используйте первый поток, чтобы сгенерировать 5 000 случайных шагов от стандартного нормального распределения. Выберите стартовую позицию в 0 и используйте cumsum вычислить совокупную сумму случайных шагов. Постройте получившийся случайный обход.

RandStream.setGlobalStream(s1)
dy1 = randn(5000,1);
y1 = cumsum([0; dy1]);
plot(y1)

Повторите процесс с помощью вторых и третьих потоков. Постройте результаты на тех же осях.

hold on;
dy2 = randn(s2,5000,1);
y2 = cumsum([0; dy2]);
plot(y2)
dy3 = randn(s3,5000,1);
y3 = cumsum([0; dy3]);
plot(y3)
hold off

Вычислите корреляции среди потоков. Корреляции между различными потоками не точно 0, потому что они вычисляются от выборки распределения.

C = corrcoef([dy1 dy2 dy3])
C = 3×3

    1.0000   -0.0363    0.0155
   -0.0363    1.0000   -0.0012
    0.0155   -0.0012    1.0000

Входные параметры

свернуть все

Алгоритм генератора случайных чисел в виде вектора символов или строкового скаляра, называющего генератор случайных чисел. MATLAB® предлагает несколько алгоритмов генератора. Следующая таблица обобщает имена и ключевые свойства доступных алгоритмов генератора. Для получения дополнительной информации смотрите Выбор Random Number Generator.

ИмяГенераторНесколько передают потоком и подпотоковая поддержкаАппроксимированный период в полной точности
'mt19937ar'Вихрь Мерсенна (используемый потоком по умолчанию при запуске MATLAB)Нет219937-1
'dsfmt19937'SIMD-ориентированный быстрый Вихрь Мерсенна Нет219937-1
'mlfg6331_64'Мультипликативный изолированный генератор ФибоначчиДа2124 (251 поток длины 272)
'mrg32k3a'Объединенный несколько рекурсивный генераторДа2191 (263 потока длины 2127)
'philox4x32_10'Philox 4x32 генератор с 10 раундамиДа2193 (264 потока длины 2129)
'threefry4x64_20'Threefry 4x64 генератор с 20 раундамиДа2514 (2 256 потоков длины 2258)
'shr3cong'Генератор сдвигового регистра суммирован с линейным congruential генераторомНет264
'swb2712'Измененный вычитают с, одалживают генераторНет21492
'mcg16807'Мультипликативный congruential генераторНет231-2

Аргументы в виде пар имя-значение

Задайте дополнительные разделенные запятой пары Name,Value аргументы. Name имя аргумента и Value соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

Пример: RandStream.create('mrg32k3a','NumStreams',3,'StreamIndices',2)

Количество независимых потоков, чтобы создать в виде разделенной запятой пары, состоящей из 'NumStreams' и положительное целое число.

Потоковые индексы в виде разделенной запятой пары, состоящей из 'StreamIndices' и вектор из положительных целых чисел или положительного целого числа. Задайте этот параметр, чтобы индексировать текущий поток из числа группы потоков, с которыми это было создано. Значением по умолчанию является 1:N, где N значение 'NumStreams'.

Seed случайных чисел в виде разделенной запятой пары, состоящей из 'Seed' и неотрицательное целое число или 'shuffle'. Seed задает начальную точку для алгоритма, чтобы сгенерировать случайные числа. 'shuffle' создает seed на основе текущего времени. Если вы задаете целое число, это должно быть между 0 и 232  − 1.

Задайте seed генератора как шаг инициализации при создании потока при запуске MATLAB или прежде, чем запустить симуляцию. Чтобы воспроизвести поток, используйте тот же seed каждый раз. В то время как использование нескольких seed создаст несколько последовательностей случайных чисел, нет никакой гарантии, что различные последовательности статистически независимы. В ситуациях, где это важно, используйте RandStream.create с несколькими выходными параметрами, чтобы создать несколько потоков, которые статистически независимы.

Алгоритм преобразования, чтобы сгенерировать нормально распределенные случайные числа от потокового использования случайных чисел randnВ виде разделенной запятой пары, состоящей из 'NormalTransform' и один из алгоритма называет 'Ziggurat'полярный, или 'Inversion'.

Опция, чтобы возвратить массив ячеек в виде разделенной запятой пары 'CellOutput' и логический false(0 ) или true(1 ). Если вы задаете 'CellOutput' как trueRandStream.create возвращает потоковые объекты как элементы массива ячеек.

Советы

Как правило, вы вызываете RandStream.create однажды, чтобы создать несколько независимых потоков в одной передаче или в начале сеанса работы с MATLAB. Например, можно создать три независимых потока при помощи [s1,s2,s3] = RandStream.create('mrg32k3a','NumStreams',3).

В качестве альтернативы можно создать каждый поток от отдельного вызова до RandStream.create, но необходимо задать соответствующие значения для gentype, 'NumStreams', 'Seed', и 'StreamIndices' гарантировать их независимость:

  • Задайте те же значения для gentype, 'NumStreams', и 'Seed' в каждом случае.

  • Задайте различное значение для 'StreamIndices' каждый раз. Все значения должны быть между 1 и значение 'NumStreams'.

Например, создайте два независимых потока при помощи s1 = RandStream.create('mrg32k3a','NumStreams',5,'Seed',0,'StreamIndices',1) и s2 = RandStream.create('mrg32k3a','NumStreams',5,'Seed',0,'StreamIndices',2).

Представленный в R2008b