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