Замените Нежелательные Синтаксисы 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' упомянутый v4 MATLAB генератор, не к значению инициализации seed.

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

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

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

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

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

'twister''twister' (рекомендуемый)

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

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

  • Воспроизведите точно те же случайные числа каждый раз, когда (e.g., при помощи 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 в устаревшем режиме используют одно из следующего:

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

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

| |

Похожие темы