MATLAB включает алгоритмы генератора, которые позволяют вам создать несколько независимых потоков случайных чисел. Например, четыре типа генератора, которые поддерживают несколько независимых потоков, являются Объединенным Несколько Рекурсивные ('mrg32k3a'
), мультипликативный изолированный Фибоначчи ('mlfg6331_64'
), Philox 4x32 ('philox4x32_10
'), и Threefry 4x64 ('threefry4x64_20
') генераторы. Можно создать несколько независимых потоков, которые, как гарантируют, не перекроются, и для который тесты, которые демонстрируют, что (псевдо) независимость значений между потоками была выполнена. Для получения дополнительной информации об алгоритмах генератора, которые поддерживают несколько потоков, см. таблицу алгоритмов генератора в Выборе Random Number Generator.
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 = 3×3
1.0000 0.0007 0.0052
0.0007 1.0000 0.0000
0.0052 0.0000 1.0000
В зависимости от приложения, создавая только некоторые потоки в наборе независимых потоков может быть полезным, если необходимо симулировать некоторые события. Задайте StreamIndices
параметр, чтобы создать только некоторые потоки от набора нескольких потоков. StreamIndex
свойство возвращает индекс каждого потока, который вы создаете.
numLabs = 256; labIndex = 4; s4 = RandStream.create('mlfg6331_64','NumStreams',numLabs,'StreamIndices',labIndex)
s4 = mlfg6331_64 random stream StreamIndex: 4 NumStreams: 256 Seed: 0 NormalTransform: Ziggurat
Несколько потоков, поскольку они статистически независимы, могут использоваться, чтобы проверить точность симуляции. Например, набор независимых потоков может использоваться, чтобы несколько раз повторять симуляцию Монте-Карло в различных сеансах работы с MATLAB или на различных процессорах и определять отклонение в результатах. Это делает несколько потоков полезными в крупномасштабных параллельных симуляциях.
Для типов генератора, которые явным образом не поддерживают независимые потоки, различные seed предоставляют метод, чтобы создать несколько потоков. При помощи различных seed можно создать потоки, которые возвращают различные значения и действуют отдельно друг от друга. Однако использование генератора, специально предназначенного для нескольких независимых потоков, является более оптимальным вариантом, когда статистические свойства через потоки были тщательно проверены.
Создайте два потока с различными seed при помощи Генератора случайных чисел Вихрь Мерсенна.
s1 = RandStream('mt19937ar','Seed',1)
s1 = mt19937ar random stream Seed: 1 NormalTransform: Ziggurat
s2 = RandStream('mt19937ar','Seed',2)
s2 = mt19937ar random stream Seed: 2 NormalTransform: Ziggurat
Используйте первый поток в одном сеансе работы с MATLAB, чтобы сгенерировать случайные числа.
r1 = rand(s1,100000,1);
Используйте второй поток в другом сеансе работы с MATLAB, чтобы сгенерировать случайные числа.
r2 = rand(s2,100000,1);
С различными seed, потоковые обычно возвращаемые значения, которые являются некоррелироваными.
corrcoef([r1,r2])
ans = 2×2
1.0000 0.0030
0.0030 1.0000
Эти два потока с различными seed могут казаться некоррелироваными, поскольку пространство состояний Вихря Мерсенна настолько больше ( элементы), чем количество возможных seed (). Возможности перекрытия в различных запусках симуляции являются довольно удаленными, если вы не используете большое количество различных seed. Используя широко расставленные seed не увеличивает уровень случайности. На самом деле беря эту стратегию до крайности и пересевая генератор, прежде чем каждый вызов может привести к последовательности значений, которые не статистически независимы и тождественно распределены.
Отбор поток является самым полезным, если вы используете его в качестве шага инициализации, возможно, при запуске MATLAB, или прежде, чем запустить симуляцию.
Другой метод, чтобы получить различные результаты потока должен использовать подпотоки. В отличие от seed, где местоположения вдоль последовательности случайных чисел не точно известны, известен интервал между подпотоками, таким образом, любой шанс перекрытия может быть устранен. Как независимые параллельные потоки, исследование было проведено, чтобы продемонстрировать статистическую независимость через подпотоки. Короче говоря, подпотоки являются более управляемым способом сделать многое из того же самого, которое seed традиционно использовались для, и более легкое решение, чем параллельные потоки.
Подпотоки обеспечивают быстрый и простой способ гарантировать, что вы получаете различные результаты того же кода в разное время. Например, сгенерируйте несколько случайных чисел в цикле.
defaultStream = RandStream('mlfg6331_64'); RandStream.setGlobalStream(defaultStream) for i = 1:5 defaultStream.Substream = i; z = rand(1,i) end
z = 0.6986
z = 1×2
0.9230 0.2489
z = 1×3
0.0261 0.2530 0.0737
z = 1×4
0.3220 0.7405 0.1983 0.1052
z = 1×5
0.2067 0.2417 0.9777 0.5970 0.4187
В другом цикле можно сгенерировать случайные значения, которые независимы от первого набора 5 итераций.
for i = 6:10 defaultStream.Substream = i; z = rand(1,11-i) end
z = 1×5
0.2650 0.8229 0.2479 0.0247 0.4581
z = 1×4
0.3963 0.7445 0.7734 0.9113
z = 1×3
0.2758 0.3662 0.7979
z = 1×2
0.6814 0.5150
z = 0.5247
Каждый из этих подпотоков может воспроизвести свою итерацию цикла. Например, можно возвратиться к 6-му подпотоку в цикле.
defaultStream.Substream = 6; z = rand(1,5)
z = 1×5
0.2650 0.8229 0.2479 0.0247 0.4581