exponenta event banner

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'Mersenne Twister (используется по умолчанию при запуске 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' и неотрицательное целое число или 'shuffle'. Начальное число определяет начальную точку алгоритма для генерации случайных чисел. 'shuffle' создает начальное значение на основе текущего времени. Если указать целое число, оно должно быть в диапазоне от 0 до 232 − 1.

Укажите начальное значение генератора в качестве шага инициализации при создании потока при запуске MATLAB или перед запуском моделирования. Чтобы воспроизвести поток, используйте одно и то же начальное число каждый раз. Хотя использование нескольких начальных чисел создаст несколько последовательностей случайных чисел, нет гарантии, что различные последовательности являются статистически независимыми. В ситуациях, когда это важно, используйте 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