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

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

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

Свойства

расширить все

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

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

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

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

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

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

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

Типы данных: 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 случайных чисел с помощью SIMD-ориентированного быстрого вихря Мерсенна.

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-ориентированного 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

Создайте поток случайных чисел с помощью seed генератора на основе текущего времени. Обычно не желательно делать это более одного раза на сеанс 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

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

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

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

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

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

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

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

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

Создайте два потока случайных чисел. Установите первый поток как глобальный при помощи 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