exponenta event banner

RandStream

Поток случайных чисел

Описание

RandStream создает поток случайных чисел с использованием заданного алгоритма генератора псевдослучайных чисел.

В MATLAB ® можно создавать псевдослучайные числа из одного или нескольких потоков случайных чисел. Самый простой способ генерации массивов случайных чисел - использоватьrand, randi, randn, и randperm функции. Все эти функции основаны на одном и том же потоке равномерно распределенных случайных чисел, известном как глобальный поток. Изменение глобального потока может включать RandStream, но это не обязательно. При создании потока с помощью RandStream, вы можете использовать RandStream.setGlobalStream чтобы сделать его глобальным потоком. Тем не менее, rng функция обеспечивает более простой интерфейс для создания глобального потока, достаточного для большинства сценариев использования.

Также можно использовать RandStream для создания потоков и последующего использования rand, randi, randn, или randperm для генерации случайных чисел из этих потоков. Сгенерированные случайные числа отделены от чисел, полученных из глобального потока или из других потоков. Дополнительные сведения см. в разделе Функции объектов.

Создание

Используйте следующие синтаксисы для создания одного потока случайных чисел. Если требуется создать несколько независимых потоков одновременно, используйте RandStream.create функция.

Описание

пример

s = RandStream(gentype) создает поток случайных чисел, который использует алгоритм генератора однородных псевдослучайных чисел, заданный gentype.

пример

s = RandStream(gentype,Name,Value) также управляет свойствами потока, используя один или несколько дополнительных Name,Value аргументы пары.

Входные аргументы

развернуть все

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

Пример: s = RandStream('mt19937ar','Seed',15,'NormalTransform','Polar')

Начальное число случайного числа, указанное как разделенная запятыми пара, состоящая из 'Seed' и неотрицательное целое число или 'shuffle'. Начальное число определяет начальную точку алгоритма для генерации случайных чисел. 'shuffle' создает начальное значение на основе текущего времени. Если указать целое число, оно должно быть в диапазоне от 0 до 232 − 1.

Укажите начальное значение генератора в качестве шага инициализации при создании потока при запуске MATLAB или перед запуском моделирования. Чтобы воспроизвести поток, используйте одно и то же начальное число каждый раз. Хотя использование нескольких начальных чисел создаст несколько последовательностей случайных чисел, нет гарантии, что различные последовательности являются статистически независимыми. В ситуациях, когда это важно, укажите свойство Substream или используйте RandStream.create для создания потоков, которые являются статистически независимыми.

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

Свойства

развернуть все

Поток случайных чисел s имеет свойства, управляющие его поведением. Доступ к свойству с помощью p = s.Property и изменить один с помощью s.Property = p. Сохранение и восстановление всех свойств потока s, вы можете использовать A = get(s) и set(s,A)соответственно. Следующий список предоставляет свойства RandStream.

Это свойство доступно только для чтения.

Алгоритм генератора случайных чисел, используемый потоком. Сводку генераторов и их свойств см. в таблице алгоритмов генератора.

Не все алгоритмы генераторов поддерживают несколько потоков. Для некоторых генераторов можно создать несколько потоков и субпотоков, которые являются статистически независимыми.

Типы данных: char

Это свойство доступно только для чтения.

Начальное число случайного числа, используемое для создания потока, возвращаемое как неотрицательное целое число.

Типы данных: uint32

Это свойство доступно только для чтения.

Число потоков в группе, в которой был создан текущий поток, возвращенное как положительное целое число.

Типы данных: uint64

Это свойство доступно только для чтения.

Индекс текущего потока из группы потоков, с помощью которого он был создан, возвращен как положительное целое число.

Типы данных: uint64

Текущее внутреннее состояние генератора, определяемое как вектор целых чисел. Размер вектора состояния зависит от алгоритма генератора. При установке этого свойства присваивается значение, s.State должно быть значением, считанным из s.State ранее. Использовать reset для возврата потока в исходное состояние без предварительного считывания из State собственность. Сохранение и восстановление внутреннего состояния генератора с помощью State свойство позволяет воспроизвести последовательность случайных чисел.

Внутреннее состояние определяет последовательность случайных чисел, производимых потоком случайных чисел s. Каждый раз при генерации случайных чисел из одного потока состояние генератора в потоке преобразуется для создания последовательных значений, которые статистически независимы и одинаково распределены.

Примечание

Только восстановить состояние потока случайных чисел или сбросить поток, чтобы воспроизвести результаты из потока.

Типы данных: uint32

Индекс подпотока, для которого в данный момент установлен поток.

Для некоторых типов генераторов можно создать различные субпотоки из случайного потока. Значения, генерируемые различными субпотоками, являются взаимно независимыми. См. таблицу алгоритмов генератора для генераторов, поддерживающих субпотоки.

Типы данных: double

Алгоритм преобразования для генерации нормально распределенных псевдослучайных значений с использованием randn.

Типы данных: char

Ли s генерирует антитетические псевдослучайные значения, указанные как логические true (1) или false (0). Антитетические значения - это генерируемые по умолчанию псевдослучайные значения с равномерным распределением, вычитаемым из 1.

Типы данных: logical

Ли s генерирует значения, используя его полную точность, заданную как логическую true (1) или false (0). Некоторые генераторы могут создавать псевдослучайные значения быстрее, но с меньшим количеством случайных битов, если FullPrecision является false.

Типы данных: logical

Функции объекта

По умолчанию функции генерации случайных чисел, такие как rand, используйте глобальный поток случайных чисел. Чтобы указать другой поток, создайте RandStream и передать его в качестве первого входного аргумента. Например, создайте вектор случайных чисел 4 на 1, используя СИМД-ориентированный быстрый мерсенновский твистер.

s = RandStream('dsfmt19937');
r = rand(s,4,1);

Эти функции принимают RandStream объект:

randРавномерно распределенные случайные числа

Поддерживаемые синтаксисы, где s является RandStream объект:

X = rand(s)
X = rand(s,n)
X = rand(s,sz1,...,szN)
X = rand(s,sz)
X = rand(s,typename)
Дополнительные сведения о других входных аргументах см. в разделе rand, randi, и randn.

randiРавномерно распределенные псевдослучайные целые числа
randnОбычно распределенные случайные числа
randpermСлучайная перестановка целых чисел

Поддерживаемые синтаксисы, где s является RandStream объект:

p = randperm(s,n)
p = randperm(s,n,k)
Дополнительные сведения о других входных аргументах см. в разделе randperm.

Другие объектные функции RandStream являются:

RandStream.createСоздание статистически независимых потоков случайных чисел
RandStream.listПеречислить алгоритмы генератора случайных чисел
RandStream.getGlobalStreamПолучить текущий глобальный поток случайных чисел
RandStream.setGlobalStreamУстановка глобального потока случайных чисел
resetСброс потока случайных чисел

Примеры

свернуть все

Создайте поток случайных чисел с помощью SIMD-Oriented Fast Mersenne Twister.

s = RandStream('dsfmt19937')
s = 
dsfmt19937 random stream
             Seed: 0
  NormalTransform: Ziggurat

Используйте поток для генерации пяти случайных чисел.

rand(s,1,5)
ans = 1×5

    0.0306    0.2131    0.2990    0.3811    0.8635

Создайте поток случайных чисел, используя начальное число генератора на основе текущего времени. Обычно нежелательно делать это более одного раза за сеанс MATLAB ®, поскольку это может повлиять на статистические свойства случайных чисел, получаемых MATLAB.

s = RandStream('mt19937ar','Seed','shuffle');

Используйте поток для создания матрицы случайных значений 3 на 3 с равномерным распределением от 0 до 1.

X1 = rand(s,3)
X1 = 3×3

    0.9817    0.8816    0.2137
    0.2375    0.5469    0.0457
    0.6608    0.8596    0.6508

Создайте еще пять случайных чисел из потока.

X2 = rand(s,1,5)
X2 = 1×5

    0.5593    0.3075    0.9171    0.5169    0.5637

Создайте поток случайных чисел, начальное число которого равно нулю.

s = RandStream('mcg16807','Seed',0);

Создайте пять случайных чисел из потока. Каждый раз, когда вы генерируете число из потока, алгоритм генератора преобразует внутреннее состояние так, чтобы следующее сгенерированное число было независимым и одинаково распределено от предыдущего числа.

u1 = rand(s,1,5)
u1 = 1×5

    0.2190    0.0470    0.6789    0.6793    0.9347

Сохранение текущего состояния генератора. Создайте еще пять случайных чисел.

savedState = s.State;
u2 = rand(s,1,5)
u2 = 1×5

    0.3835    0.5194    0.8310    0.0346    0.0535

Для воспроизведения последнего результата из пяти случайных чисел восстановите состояние генератора в сохраненное состояние.

s.State = savedState;
u3 = rand(s,1,5)
u3 = 1×5

    0.3835    0.5194    0.8310    0.0346    0.0535

Только чтение и запись состояния генератора для воспроизведения определенного результата из потока.

Создайте поток случайных чисел, начальное число которого равно трем. Используйте поток для генерации восьми случайных чисел.

stream = RandStream('dsfmt19937','Seed',3);
z = rand(stream,1,8)
z = 1×8

    0.2550    0.8753    0.0908    0.1143    0.3617    0.8210    0.8444    0.6189

Сбросьте поток случайных чисел в исходное состояние с начальным числом, равным трем. Воспроизвести восемь сгенерированных случайных чисел.

reset(stream,3);
z = rand(stream,1,8)
z = 1×8

    0.2550    0.8753    0.0908    0.1143    0.3617    0.8210    0.8444    0.6189

Сброс начального значения потока может сделать независимость недействительной для других потоков. Сброс только потока для воспроизведения результатов из потока.

Создайте два потока случайных чисел. Установка первого потока в качестве глобального с помощью RandStream.setGlobalStream.

globalStream = RandStream('mlfg6331_64','NormalTransform','Polar')
globalStream = 
mlfg6331_64 random stream
             Seed: 0
  NormalTransform: Polar
RandStream.setGlobalStream(globalStream);

Чтобы показать текущий глобальный поток, используйте RandStream.getGlobalStream.

RandStream.getGlobalStream
ans = 
mlfg6331_64 random stream (current global stream)
             Seed: 0
  NormalTransform: Polar

Создание второго потока myStream который действует отдельно от созданного вами нового глобального потока.

myStream = RandStream('dsfmt19937','NormalTransform','Inversion')
myStream = 
dsfmt19937 random stream
             Seed: 0
  NormalTransform: Inversion

Создайте три случайных числа из глобального потока. Создать еще три случайных числа из локального потока myStream который вы создали.

randn(1,3)
ans = 1×3

    0.8715    1.0588   -0.6956

randn(myStream,1,3)
ans = 1×3

   -1.8723   -0.7956   -0.5273

При вызове функций rand, randn, и randi без myStream, они черпают из глобального потока, и не повлияют на результаты вызова их с myStream.

Для некоторых типов генераторов можно создать различные субпотоки из случайного потока. Значения, генерируемые различными субпотоками, являются взаимно независимыми.

Например, создать поток случайных чисел, используя комбинированный множественный рекурсивный генератор.

s = RandStream('mrg32k3a');

Чтобы переместить поток в конкретный подпоток, задайте его Substream собственность. Например, генерировать случайные числа в цикле. Расположите поток случайных чисел в начале другого подпотока перед каждой итерацией цикла. Создайте 3 взаимно независимых набора из 5 случайных чисел.

for i = 1:3
    s.Substream = i;
    z = rand(s,1,5)
end
z = 1×5

    0.7270    0.4522    0.9387    0.2360    0.0277

z = 1×5

    0.5582    0.8527    0.7733    0.0633    0.2788

z = 1×5

    0.1666    0.2924    0.7728    0.8391    0.5107

Чтобы воспроизвести второй набор из 5 случайных чисел, переместите поток в соответствующий субпоток.

s.Substream = 2;
z = rand(s,1,5)
z = 1×5

    0.5582    0.8527    0.7733    0.0633    0.2788

Подробнее

развернуть все

Представлен в R2008b