Управление Global Stream

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