MATLAB включает алгоритмы генератора, которые позволяют вам создавать несколько независимых потоков случайных чисел. Метод фабрики RandStream.create
позволяет вам создавать три потока, которые имеют тот же алгоритм генератора и отбирают значение, но статистически независимы.
[s1,s2,s3]=RandStream.create('mlfg6331_64','NumStreams',3) s1 = mlfg6331_64 random stream StreamIndex: 1 NumStreams: 3 Seed: 0 NormalTransform: Ziggurat s2 = mlfg6331_64 random stream StreamIndex: 2 NumStreams: 3 Seed: 0 NormalTransform: Ziggurat s3 = mlfg6331_64 random stream StreamIndex: 3 NumStreams: 3 Seed: 0 NormalTransform: Ziggurat
Как доказательство независимости, вы видите, что эти потоки являются в основном некоррелироваными.
r1=rand(s1,100000,1); r2=rand(s2,100000,1); r3=rand(s3,100000,1); corrcoef([r1,r2,r3]) ans = 1.0000 -0.0017 -0.0010 -0.0017 1.0000 -0.0050 -0.0010 -0.0050 1.0000
При помощи различных seed можно создать потоки, которые возвращают различные значения и действуют отдельно друг от друга.
s1=RandStream('mt19937ar','seed',1); s2=RandStream('mt19937ar','seed',2); s3=RandStream('mt19937ar','seed',3);
Значения seed должны быть целыми числами между 0 и . С различными seed, потоковые обычно возвращаемые значения, которые являются некоррелироваными.
r1=rand(s1,100000,1); r2=rand(s2,100000,1); r3=rand(s3,100000,1); corrcoef([r1,r2,r3]) ans = 1.0000 0.0030 0.0045 0.0030 1.0000 -0.0015 0.0045 -0.0015 1.0000
Для типов генератора, которые явным образом не поддерживают независимые потоки, различные seed предоставляют метод, чтобы создать несколько потоков. Однако использование генератора, специально предназначенного для нескольких независимых потоков, является более оптимальным вариантом, когда статистические свойства через потоки лучше поняты.
В зависимости от приложения может быть полезно создать только некоторые потоки в наборе независимых потоков. Свойство StreamIndex
возвращает индекс заданного потока от набора сгенерированных фабрикой потоков.
numLabs=256; labIndex=4; s1=RandStream.create('mlfg6331_64', 'NumStreams',numLabs,'StreamIndices',labIndex) s1= mlfg6331_64 random stream StreamIndex: 4 NumStreams: 256 Seed: 0 NormalTransform: Ziggurat
Несколько потоков, поскольку они статистически независимы, могут использоваться, чтобы проверить точность симуляции. Например, набор независимых потоков может использоваться, чтобы несколько раз повторять симуляцию Монте-Карло в различных сеансах работы с MATLAB или на различных процессорах и определять отклонение в результатах. Это делает несколько потоков полезными в крупномасштабных параллельных симуляциях.
Не все алгоритмы генераторов поддерживают несколько потоков. См. таблицу алгоритмов генератора в Выборе Random Number Generator для сводных данных свойств генератора.