Поток случайных чисел
Псевдослучайные числа в MATLAB® прибывают из одного или нескольких потоков случайных чисел. Самый простой способ сгенерировать массивы случайных чисел состоит в том, чтобы использовать rand
, randn
или randi
. Эти функции все полагаются на тот же поток универсальных случайных чисел, известных the global stream. Можно создать другие потоки, которые действуют отдельно от глобального потока, и можно использовать их rand
, randi
или методы randn
, чтобы сгенерировать массивы случайных чисел. Можно также создать поток случайных чисел и сделать его глобальным потоком.
Чтобы создать один поток случайных чисел, используйте конструктора RandStream
. Чтобы создать несколько независимых потоков случайных чисел, используйте RandStream.create
. Функция rng
обеспечивает простой интерфейс, чтобы создать новый глобальный поток.
stream = RandStream.getGlobalStream
возвращает глобальный поток случайных чисел, то есть, тот, в настоящее время используемый rand
, randi
и функциями randn
.
prevstream = RandStream.setGlobalStream(stream)
называет поток случайных чисел stream
как новый глобальный поток, который будет использоваться rand
, randi
и функциями randn
, и возвращает предыдущий глобальный поток.
Потоковый s
случайных чисел имеет свойства, которые управляют его поведением. Доступ или присвоение к свойству с помощью p = s.Property
или s.Property = p
. В следующей таблице перечислены заданные свойства:
Свойство | Описание |
---|---|
Type | Алгоритм Генератора (Только для чтения) используется потоком. Список возможных генераторов дан RandStream.list . |
Seed | Значение Seed (Только для чтения) раньше создавало поток. |
NumStreams | Количество (Только для чтения) потоков в группе, в которой был создан текущий поток. |
StreamIndex | Индекс (Только для чтения) текущего потока из числа группы потоков, с которыми это было создано. |
State | Внутреннее состояние генератора. Вы не должны зависеть от формата этого свойства. Значение, которое вы присваиваете Последовательность случайных чисел, произведенных потоком случайных чисел |
Substream | Индекс подпотока, в который в настоящее время установлен поток. Значение по умолчанию равняется 1. Несколько подпотоков не поддержаны всеми типами генератора; мультипликативный изолированный генератор Фибоначчи (mlfg6331_64 ) и объединенный несколько рекурсивный генератор (mrg32k3a ) подпотоки поддержки. |
NormalTransform | Алгоритм преобразования, используемый randn(s, ...) , чтобы сгенерировать нормальные псевдослучайные значения. Возможными значениями является 'Ziggurat' , 'Polar' или 'Inversion' . |
Antithetic | Логическое значение, указывающее, генерирует ли S прямо противоположные псевдослучайные значения, то есть, обычные значения, вычтенные от 1. Значение по умолчанию является ложным. |
FullPrecision | Логическое значение, указывающее, генерирует ли S значения с помощью своей полной точности. Некоторые генераторы могут создать псевдослучайную стоимость быстрее, но с меньшим количеством случайных битов, если FullPrecision является ложным. Значение по умолчанию верно. |
Метод | Описание |
---|---|
RandStream | Создайте поток случайных чисел. |
RandStream.create | Создайте несколько независимых потоков случайных чисел. |
get | Получите свойства случайного потокового объекта. |
list | Перечислите доступные алгоритмы генератора случайных чисел. |
set | Установите случайное потоковое свойство. |
RandStream.getGlobalStream | Получите глобальный поток случайных чисел. |
RandStream.setGlobalStream | Установите глобальный поток случайных чисел. |
reset | Сбросьте поток к его начальному внутреннему состоянию |
rand | Псевдослучайные числа от равномерного распределения |
randn | Псевдослучайные числа от стандартного нормального распределения |
randi | Псевдослучайные целые числа от универсального дискретного распределения |
randperm | Случайная перестановка множества значений |
Создайте единый поток и определяйте его как текущий глобальный поток:
s = RandStream('mt19937ar','Seed',1); RandStream.setGlobalStream(s);
Создайте три независимых потока:
[s1,s2,s3] = RandStream.create('mrg32k3a','NumStreams',3); r1 = rand(s1,100000,1); r2 = rand(s2,100000,1); r3 = rand(s3,100000,1); corrcoef([r1,r2,r3])
Создайте только один поток из набора трех независимых потоков и определяйте его как текущий глобальный поток:
s2 = RandStream.create('mrg32k3a','NumStreams',3,... 'StreamIndices',2); RandStream.setGlobalStream(s2);
Сбросьте глобальный поток случайных чисел, который лежит в основе rand
, randi
, и randn
назад к его началу, чтобы воспроизвести предыдущие результаты:
stream = RandStream.getGlobalStream; reset(stream);
Сохраните и восстановите состояние текущего глобального потока, чтобы воспроизвести вывод rand
:
stream = RandStream.getGlobalStream; savedState = stream.State; u1 = rand(1,5) u1 = 0.8147 0.9058 0.1270 0.9134 0.6324 stream.State = savedState; u2 = rand(1,5) u2 = 0.8147 0.9058 0.1270 0.9134 0.6324
u2
содержит точно те же значения как u1
.Сбросьте глобальный поток случайных чисел к его начальным установкам. Это заставляет rand
, randi
и randn
запускаться, как будто в новом сеансе работы с MATLAB:
s = RandStream('mt19937ar','Seed',0); RandStream.setGlobalStream(s);
Повторно инициализируйте глобальный поток случайных чисел с помощью seed на основе текущего времени. Это заставляет rand
, randi
и randn
возвращать различные значения в различных сеансах работы с MATLAB. Обычно не желательно сделать это несколько раз на сеанс работы с MATLAB, когда это может влиять на статистические свойства случайных чисел, которые производит MATLAB:
s = RandStream('mt19937ar','Seed','shuffle'); RandStream.setGlobalStream(s);
Измените алгоритм преобразования что использование randn
, чтобы создать нормальную псевдослучайную стоимость от универсальных значений. Это не заменяет или сбрасывать глобальный поток.
stream = RandStream.getGlobalStream; stream.NormalTransform = 'inversion'