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

randrandn, и 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

randrandi, и 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'полярный, или '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

Смотрите также

Похожие темы