Поток случайных чисел
Псевдослучайные числа в 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.6324u2 содержит точно те же значения как 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'