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 = 1
rand
, 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
.
Метод | Описание |
---|---|
RandStream | Создайте поток случайных чисел |
RandStream.create | Создайте несколько независимых потоков случайных чисел |
get | Получите свойства случайного потока |
RandStream.list | Перечислите доступные алгоритмы генератора случайных чисел |
RandStream.getGlobalStream | Получите глобальный поток случайных чисел |
RandStream.setGlobalStream | Установите глобальный поток случайных чисел |
set | Установите свойство случайного потока |
reset | Сбросьте поток к его начальному внутреннему состоянию |
rand | Сгенерируйте псевдослучайные числа от равномерного распределения |
randn | Сгенерируйте псевдослучайные числа от стандартного нормального распределения |
randi | Сгенерируйте псевдослучайные целые числа от универсального дискретного распределения |
randperm | Случайная перестановка множества значений |
Свойствам случайного потока дают следующую таблицу.
Свойство | Описание |
---|---|
Type | Алгоритм Генератора (Только для чтения) используется потоком. 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 = 1
rand
и 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 = 1
rand
и 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.0344
randi
поддерживает оба целочисленных типа и одинарную или двойную точность.
A=randi([1 10],1,5,'double'); class(A) ans = double B=randi([1 10],1,5,'uint8'); class(B) ans = uint8