Несколько потоков

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 и 2321. С различными 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 для сводных данных свойств генератора.

Смотрите также

Похожие темы