RandStream

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

Описание

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

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

Можно также использовать RandStream создать потоки и randrandirandn, или randperm сгенерировать случайные числа отдельно от чертивших от глобального потока от других потоков. Для получения дополнительной информации см. Функции объекта.

Создание

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

Описание

пример

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

пример

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

Входные параметры

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

Алгоритм генератора случайных чисел в виде вектора символов или строкового скаляра, называющего генератор случайных чисел. MATLAB предлагает несколько алгоритмов генератора. Следующая таблица обобщает имена и ключевые свойства доступных алгоритмов генератора. Некоторые алгоритмы генератора поддерживают несколько потоков и подпотоков, чтобы создать наборы случайных чисел, которые взаимно независимы. Для получения дополнительной информации смотрите Выбор Random Number Generator.

ИмяГенераторНесколько передают потоком и подпотоковая поддержкаАппроксимированный период в полной точности
'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'Threefry 4x64 генератор с 20 раундамиДа2514 (2 256 потоков длины 2258)
'shr3cong'Генератор сдвигового регистра суммирован с линейным congruential генераторомНет264
'swb2712'Измененный вычитают с, одалживают генераторНет21492
'mcg16807'Мультипликативный congruential генераторНет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 каждый раз. В то время как использование нескольких seed создаст несколько последовательностей случайных чисел, нет никакой гарантии, что различные последовательности статистически независимы. В ситуациях, где это важно, задайте свойство Substream или использование RandStream.create создать потоки, которые статистически независимы.

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

Типы данных: логический

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

Типы данных: логический

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

По умолчанию, функции генерации случайных чисел, такой как 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-ориентированного Быстрого Вихря Мерсенна.

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.0359    0.1928    0.5177
    0.0030    0.1561    0.4449
    0.7540    0.9466    0.7731

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

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

    0.9629    0.0221    0.8222    0.9187    0.6404

Создайте поток случайных чисел, 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

Когда вы вызываете функции randrandn, и 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