В более ранних версиях 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)
задает тип генератора, как описано здесь.
|
The v4
и v5
генераторы больше не рекомендуются, если вы не пытаетесь точно воспроизвести случайные числа, сгенерированные в более ранних версиях MATLAB. Самый простой способ обновить свой код - использовать rng
. rng
функция заменяет имена для rand
и randn
генераторы следующим образом.
Имя генератора rand/randn | Имя генератора rng |
---|---|
'seed' | 'v4' |
'state' |
|
'twister' | 'twister' рекомендуется |
Наиболее распространенные способы использования целочисленного 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.