Поток случайных чисел
Псевдослучайные числа в MATLAB® прибывают из одного или нескольких потоков случайных чисел. Самый простой способ сгенерировать массивы случайных чисел состоит в том, чтобы использовать randrandn, или randi. Эти функции все используют тот же поток универсальных случайных чисел, известных the global stream. Можно создать другие потоки, которые действуют отдельно от глобального потока, и можно использовать их randrandi, или randn методы, чтобы сгенерировать массивы случайных чисел. Можно также создать поток случайных чисел и сделать его глобальным потоком.
Чтобы создать один поток случайных чисел, используйте RandStream конструктор. Чтобы создать несколько независимых потоков случайных чисел, используйте RandStream.create. rng функция обеспечивает простой интерфейс, чтобы создать новый глобальный поток.
stream = RandStream.getGlobalStream возвращает глобальный поток случайных чисел, то есть, тот, в настоящее время используемый randrandi, и randn функции.
prevstream = RandStream.setGlobalStream(stream) называет поток случайных чисел stream как новый глобальный поток, который будет использоваться randrandi, и 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'полярный, или '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);Сбросьте глобальный поток случайных чисел, который лежит в основе randrandi, и 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.6324u2 содержит точно те же значения как u1.Сбросьте глобальный поток случайных чисел к его начальным установкам. Это вызывает randrandi, и randn запускаться, как будто в новом сеансе работы с MATLAB:
s = RandStream('mt19937ar','Seed',0);
RandStream.setGlobalStream(s);Повторно инициализируйте глобальный поток случайных чисел с помощью seed на основе текущего времени. Это вызывает randrandi, и randn возвращать различные значения в различных сеансах работы с MATLAB. Обычно не желательно сделать это несколько раз на сеанс работы с MATLAB, когда это может влиять на статистические свойства случайных чисел, которые производит MATLAB:
s = RandStream('mt19937ar','Seed','shuffle');
RandStream.setGlobalStream(s);Измените алгоритм преобразования что randn использование, чтобы создать нормальную псевдослучайную стоимость от универсальных значений. Это не заменяет или сбрасывать глобальный поток.
stream = RandStream.getGlobalStream; stream.NormalTransform = 'inversion'