Замените обескураженные синтаксисы rand и randn

Описание обескураженных синтаксисов

В более ранних версиях MATLAB®, вы контролировали генератор случайных чисел, используемый rand и randn функции со 'seed', 'state' или 'twister' входы. Для примера:

rand('seed',sd)
randn('seed',sd)
rand('state',s)
randn('state',s)
rand('twister',5489)

Эти синтаксисы относятся к различным типам генераторов, и они больше не рекомендуются по следующим причинам:

  • Условия 'seed' и 'state' вводят в заблуждение имена генераторов.

  • Все генераторы кроме 'twister' ущербны.

  • Они излишне используют различные генераторы для rand и randn.

Чтобы оценить влияние замены обескураженных синтаксисов в существующем коде, выполните следующие команды в начале своего Сеанса работы с MATLAB:

warning('on','MATLAB:RandStream:ActivatingLegacyGenerators')
warning('on','MATLAB:RandStream:ReadingInactiveLegacyGeneratorState') 

Описание синтаксиса замены

Используйте rng функция для управления общим генератором, используемым rand, randn, randi и все другие функции генерации случайных чисел, такие как randperm, sprandи так далее. Чтобы узнать, как использовать rng функция при замене обескураженных синтаксисов занимает несколько моментов, чтобы понять их функцию. Это должно помочь вам увидеть, какие новые rng синтаксис наилучшим образом соответствует вашим потребностям.

Первый вход в rand(Generator,s) или randn(Generator,s) задает тип генератора, как описано здесь.

Generator = 'seed' ссылка на MATLAB v4 генератор, а не к seed значению инициализации.

Generator = 'state' ссылка на MATLAB v5 генераторы, а не внутреннее состояние генератора.

Generator = 'twister' относится к генератору Случайных Чисел Вихрь Мерсенна, ныне - к генератору запуска MATLAB.

The v4 и v5 генераторы больше не рекомендуются, если вы не пытаетесь точно воспроизвести случайные числа, сгенерированные в более ранних версиях MATLAB. Самый простой способ обновить свой код - использовать rng. rng функция заменяет имена для rand и randn генераторы следующим образом.

Имя генератора rand/randnИмя генератора rng
'seed''v4'
'state'

'v5uniform' (для rand)
         или
'v5normal' (для randn)

'twister''twister' рекомендуется

Синтаксис замены для инициализации генератора на целое число Seed

Наиболее распространенные способы использования целочисленного sd seed в rand(Generator,sd) синтаксис:

  • Воспроизводите точно такие же случайные числа каждый раз (например, с помощью seed, такого как 0, 1 или 3141879)

  • Постарайтесь убедиться, что MATLAB всегда дает различные случайные числа в отдельных запусках (для примера, с помощью seed, такой как sum(100*clock))

В следующей таблице показаны замены синтаксисов на целочисленный seed sd.

  • В первом столбце показан обескураженный синтаксис с rand и randn.

  • Во втором столбце показано, как точно воспроизвести обескураженное поведение с новым rng функция. В большинстве случаев это делается путем определения устаревшего типа генератора, такого как генераторы v4 или v5, что больше не рекомендуется.

  • В третьем столбце показана рекомендуемая альтернатива, которая не задает дополнительный тип генератора входа rng. Поэтому, если вы всегда опускаете Generator вход, rand, randn, и randi просто используйте Генератор случайных чисел Вихрь Мерсенна по умолчанию, которая используется при запуске MATLAB. В будущих релизах, когда новые генераторы заменяют Вихрь Мерсенна, этот код будет использовать новый по умолчанию.

Синтаксис обескураженного rand/randnНе Рекомендуемый: Воспроизведение обескураженного поведения точно путем определения типа генератораРекомендуемая альтернатива: не переопределяет тип генератора
rand('twister',5489)rng(5489,'twister')rng('default')
rand('seed',sd)rng(sd,'v4')rng(sd)
randn('seed',sd)
rand('state',sd)rng(sd,'v5uniform')
randn('state',sd)rng(sd,'v5normal')
rand('seed',sum(100*clock))rng(sum(100*clock),'v4')rng('shuffle')

Синтаксис замены для инициализации генератора на вектор состояний

Наиболее распространенное использование вектора состояний (показано здесь как st) в rand(Generator,st) синтаксис состоял в том, чтобы точно воспроизвести случайные числа, сгенерированные в определенной точке алгоритма или итерации. Например, вы можете использовать этот вектор как средство отладки.

rng функция изменяет шаблон сохранения и восстановления состояния генератора случайных чисел, как показано на следующей таблице. Пример в левом столбце предполагает, что вы используете v5 равномерный генератор. Пример в правом столбце использует новый синтаксис и работает для любого генератора, который вы используете.

Обескураженный синтаксис с использованием rand/randnНовый синтаксис с использованием rng
% Save v5 generator state.
st = rand('state');

% Call rand.
x = rand;

% Restore v5 generator state.
rand('state',st);

% Call rand again and hope 
% for the same results.
y = rand
% Get generator settings.
s = rng;

% Call rand.
x = rand;

% Restore previous generator 
% settings.
rng(s);

% Call rand again and 
% get the same results.
y = rand

Для демонстрации смотрите это обучающее видео.

Если вы не можете обновиться из обескураженного синтаксиса

Если существует код, который вы не можете или не разрешено изменять, и вы знаете, что он использует обескураженные синтаксисы управления генератором случайных чисел, важно помнить, что, когда вы используете этот код, MATLAB переключается на legacy mode. В унаследованном режиме, rand и randn управляются отдельными генераторами, каждый со своими настройками.

Вызовы на rand в унаследованном режиме используйте одно из следующих:

  • The 'v4' генератор, управляемый rand('seed', ...)

  • The 'v5uniform' генератор, управляемый rand('state', ...)

  • The 'twister' генератор, управляемый rand('twister', ...)

Вызовы на randn в унаследованном режиме используйте одно из следующих:

  • The 'v4' генератор, управляемый randn('seed', ...)

  • The 'v5normal' генератор, управляемый randn('state', ...)

Если код, на который вы полагаетесь, переводит MATLAB в устаревший режим, используйте следующую команду, чтобы избежать устаревшего режима и вернуться к генератору запуска по умолчанию:

rng default

Кроме того, чтобы защитить код, который переводит MATLAB в устаревший режим, используйте:

s = rng     % Save current settings of the generator.
  ...       % Call code using legacy random number generator syntaxes.
rng(s)      % Restore previous settings of the generator.

См. также

| |

Похожие темы