exponenta event banner

Заменить обескураженные синтаксисы 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 генератор, а не в начальное значение инициализации.

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

Generator = 'twister' относится к генератору Мерсенна Твистера, теперь генератор запуска MATLAB.

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

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

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

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

Замещающие синтаксисы для инициализации генератора с целочисленным начальным числом

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

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

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

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

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

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

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

Обескураженный синтаксис 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 будет переключаться в устаревший режим. В унаследованном режиме rand и randn управляются отдельными генераторами, каждый из которых имеет свои настройки.

Звонки в rand в унаследованном режиме используйте одно из следующих действий.

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

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

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

Звонки в randn в унаследованном режиме используйте одно из следующих действий.

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

  • '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.

См. также

| |

Связанные темы