RandStream.create

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

Описание

s = RandStream.create(gentype) создает один случайный поток, который использует однородный алгоритм генератора псевдослучайных чисел, заданный gentype. RandStream.list возвращает все возможные значения для gentypeили см. Создание и управление потоком случайных чисел для получения дополнительной информации об алгоритмах генератора. 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);

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

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

Figure contains an axes. The axes contains an object of type line.

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

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

Figure contains an axes. The axes contains 3 objects of type line.

Вычислите корреляции между потоками. Корреляции между различными потоками не совсем 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® предлагает несколько алгоритмов генератора. В следующей таблице приведены имена и ключевые свойства доступных алгоритмов генератора. Для получения дополнительной информации смотрите Создание и управление потоком случайных чисел.

ИмяГенераторПоддержка нескольких потоков и субпотоковПриблизительный период в полной точности
'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'Трехфазный генератор 4x64 с 20 патронамиДа2514 (2256 потоки длиной 2258)
'shr3cong'Генератор сдвигового регистра, суммированный линейным конгруэнтным генераторомНет264
'swb2712'Измененное вычитание с генератором заимствованийНет21492
'mcg16807'Мультипликативный конгруенциальный генераторНет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 каждый раз. В то время как использование нескольких начальных чисел создаст несколько последовательностей случайных чисел, нет гарантии, что различные последовательности являются статистически независимыми. В ситуациях, когда это важно, используйте RandStream.create с несколькими выходами, чтобы создать несколько потоков, которые являются статистически независимыми.

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

Опция возврата массива ячеек, заданная как разделенная разделенными запятой парами 'CellOutput' и логические false (0) или true (1). Если вы задаете 'CellOutput' как true, RandStream.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