rand, randn и randi чертят случайные числа от базового потока случайных чисел, названного глобальным потоком. Функция rng обеспечивает простой способ управлять глобальным потоком. Для более всестороннего управления класс RandStream позволяет вам получать указатель на глобальный поток и управлять генерацией случайных чисел.
Получите указатель на глобальный поток можно следующим образом:
globalStream = RandStream.getGlobalStream
globalStream =
mt19937ar random stream (current global stream)
Seed: 0
NormalTransform: ZigguratВозвратите свойства потока с методом get:
get(globalStream)
Type: 'mt19937ar'
NumStreams: 1
StreamIndex: 1
Substream: 1
Seed: 0
State: [625x1 uint32]
NormalTransform: 'Ziggurat'
Antithetic: 0
FullPrecision: 1Теперь, используйте функцию rand, чтобы сгенерировать универсальные случайные значения от глобального потока.
rand(1,5);
Используйте randn и функции randi, чтобы сгенерировать нормальные случайные значения и целочисленные случайные значения от глобального потока.
A = randi(100,1,5); A = randn(1,5);
Свойство State является внутренним состоянием генератора. Можно сохранить State globalStream.
myState = globalStream.State;
Используя myState, можно восстановить состояние globalStream и воспроизвести предыдущие результаты.
myState = globalStream.State;
A = rand(1,100);
globalStream.State = myState;
B=rand(1,100);
isequal(A,B)
ans =
1rand, randi и randn получают доступ к глобальному потоку. Поскольку все эти функции получают доступ к тому же базовому потоку, вызову, каждый влияет на значения, произведенные другими в последующих вызовах.
globalStream.State = myState;
A = rand(1,100);
globalStream.State = myState;
randi(100);
B = rand(1,100);
isequal(A,B)
ans =
0Глобальный поток является объектом указателя класса RandStream. RandStream.getGlobalStream возвращает указатель. Свойства глобального потока могут быть просмотрены или изменены от любого указателя до потока.
stream1=RandStream.getGlobalStream; stream2=RandStream.getGlobalStream; stream1.NormalTransform='Polar'; stream2.NormalTransform ans = Polar
Следующая таблица показывает методы, доступные для класса RandStream. Статические методы обозначаются с синтаксисом RandStream.methodName methodName .
| Метод | Описание |
|---|---|
RandStream | Создайте поток случайных чисел |
RandStream.create | Создайте несколько независимых потоков случайных чисел |
получение | Получите свойства случайного потока |
RandStream.list | Перечислите доступные алгоритмы генератора случайных чисел |
RandStream.getGlobalStream | Получите глобальный поток случайных чисел |
RandStream.setGlobalStream | Установите глобальный поток случайных чисел |
набор | Установите свойство случайного потока |
сброс | Сбросьте поток к его начальному внутреннему состоянию |
rand | Сгенерируйте псевдослучайные числа от равномерного распределения |
randn | Сгенерируйте псевдослучайные числа от стандартного нормального распределения |
randi | Сгенерируйте псевдослучайные целые числа от универсального дискретного распределения |
randperm | Случайная перестановка множества значений |
Свойствам случайного потока дают следующую таблицу.
| Свойство | Описание |
|---|---|
Ввод | Алгоритм Генератора (Только для чтения) используется потоком. RandStream.list задает возможные генераторы. |
Seed | Значение Seed (Только для чтения) раньше создавало поток. |
NumStreams | Количество (Только для чтения) потоков в группе, в которой был создан текущий поток. |
StreamIndex | Индекс (Только для чтения) текущего потока из числа группы потоков, с которыми был создан текущий поток. |
State | Внутреннее состояние генератора. Не зависьте от формата этого свойства. Значение, которое вы присваиваете S.State, должно быть значением, ранее считанным из S.State. |
Substream | Индекс подпотока, в который в настоящее время устанавливается поток. Значение по умолчанию равняется 1. Несколько подпотоков не поддержаны всеми типами генератора; мультипликативный изолированный генератор Фибоначчи (mlfg6331_64) и объединенный несколько рекурсивный генератор (mrg32k3a) подпотоки поддержки. |
NormalTransform | Алгоритм преобразования, используемый randn(s, ...), чтобы сгенерировать нормальные псевдослучайные значения. Возможными значениями является 'Ziggurat', 'Polar' или 'Inversion'. |
Antithetic | Логическое значение, указывающее, генерирует ли S прямо противоположные псевдослучайные значения. Для универсальных значений это обычные значения, вычтенные от 1. Значение по умолчанию является ложным. |
FullPrecision | Логическое значение, указывающее, генерирует ли s значения с помощью своей полной точности. Некоторые генераторы могут создать псевдослучайную стоимость быстрее, но с меньшим количеством случайных битов, если FullPrecision является ложным. Значение по умолчанию верно. |
Предположим, что вы хотите повторить моделирование. Класс RandStream дает вам несколько способов реплицировать вывод. Как показано в предыдущем примере, можно сохранить состояние глобального потока.
myState=GlobalStream.State;
A=rand(1,100);
GlobalStream.State=myState;
B=rand(1,100);
isequal(A,B)
ans =
1Можно также сбросить поток к его начальным установкам с методом reset.
reset(GlobalStream)
A=rand(1,100);
reset(GlobalStream)
B=rand(1,100);
isequal(A,B)
ans =
1rand и randn генерируют значения в двойной точности по умолчанию.
GlobalStream=RandStream.getGlobalStream; myState=GlobalStream.State; A=rand(1,5); class(A) ans = double
Задавать класс как дважды явным образом:
GlobalStream.State=myState;
B=rand(1,5,'double');
class(B)
ans =
double
isequal(A,B)
ans =
1rand и randn также сгенерируют значения в одинарной точности.
GlobalStream.State=myState; A=rand(1,5,'single'); class(A) ans = single
Значения эквивалентны, если вы бросили значения двойной точности от предыдущего примера. Случайный поток, что функции чертят от усовершенствований тот же путь независимо от того, какой класс значений возвращен.
A,B
A =
0.8235 0.6948 0.3171 0.9502 0.0344
B =
0.8235 0.6948 0.3171 0.9502 0.0344randi поддерживает оба целых типа и одинарную или двойную точность.
A=randi([1 10],1,5,'double'); class(A) ans = double B=randi([1 10],1,5,'uint8'); class(B) ans = uint8