Замените Нежелательные Синтаксисы 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 переключится в устаревший режим. В устаревшем режиме 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.
Была ли эта тема полезной?