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) への最初の入力では、ここで説明したように発生器のタイプを指定しました。
|
|
v4 発生器と v5 発生器は、旧バージョンの MATLAB で発生した乱数を正確に再現しようとする場合以外は、推奨されなくなりました。コードを更新する最も簡単な方法は、rng を使用することです。関数 rng は、rand 発生器と randn 発生器の名前を次のように置き換えます。
| rand/randn 発生器名 | rng 発生器名 |
|---|---|
'seed' | 'v4' |
'state' |
|
'twister' | 'twister' (推奨) |
整数シードによる発生器の初期化に使用する置き換え構文
rand(Generator,sd) 構文における整数シード sd の最も一般的な用途は、以下のとおりです。
同じ乱数を毎回正確に再現する (たとえば、0、1、または 3141879 などのシードを使用する)
MATLAB が別々の実行で常に異なる乱数を提供するようにする (たとえば、
sum(100*clock)などのシードを使用する)
次の表は、構文と整数シード sd の置換を示しています。
最初の列は
randとrandnを使用した非推奨構文を示しています。2 番目の列は、新しい関数
rngで非推奨動作を正確に再現する方法を示しています。ほとんどの場合、v4 または v5 発生器などのレガシ発生器タイプを指定することによって行われますが、これは、今では推奨されません。3 番目の列は、
rngへのオプションの入力の発生器タイプを指定しない推奨代替手段を示しています。このため、"常に"Generatorの入力を省略する場合、rand、randn、およびrandiは既定の発生器のタイプとシード値だけを使用します。MATLAB の起動時に使用される既定の発生器のタイプはメルセンヌ・ツイスター発生器で、シード値は 0 です。MATLAB 設定で乱数発生器の既定のアルゴリズムとシードを変更できるようになりました (R2023b 以降)。詳細については、rngを参照してください。
| 非推奨の 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') |
状態ベクトルによる発生器の初期化に使用する置き換え構文
rand(Generator,st) 構文における状態ベクトル (ここでは 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.