異なる乱数の生成
この例では、MATLAB® を再起動した際に同じ乱数の配列が繰り返されないようにする方法を示します。この手法は、異なる MATLAB セッションで実行した同じ乱数コマンドの結果を組み合わせる場合に便利です。
乱数関数 rand
、randn
、randi
、randperm
はすべて、共有の乱数発生器から値を取得します。MATLAB を起動するたびに、乱数発生器は同じ状態にリセットされます。このため、rand(2,2)
のようなコマンドを起動直後に実行すると、いつでも同じ結果が返されます。また、乱数関数を呼び出すスクリプトや関数はいずれも、再起動後には同じ結果を返します。
異なる乱数を取得する 1 つの方法は、毎回異なるシードを使用して発生器を初期化することです。これにより、前のセッションと同じ結果の繰り返しは確実に避けられます。
乱数関数のいずれかを呼び出す前に、MATLAB セッションで rng('shuffle')
コマンドを 1 回実行します。
rng('shuffle')
このコマンドは MATLAB のコマンド ウィンドウで実行することができ、また、スタートアップ ファイルに追加することもできます。これは、再起動するたびに MATLAB で実行される特殊スクリプトです。
ここで、乱数コマンドを実行します。
A = rand(2,2);
rng('shuffle')
は呼び出されるたびに、現在の時刻に基づく異なるシードを使用して乱数発生器を再シードします。
メモ
発生器を頻繁に再シードしても、出力の統計的特性が改善されることや、実際に出力がよりランダムになることはありません。再シードは、MATLAB を再起動するときや、乱数を使用する大規模計算を実行する前に使用すると便利なことがあります。ただし、セッション内で発生器を頻繁に再シードすることは、乱数の統計的特性に悪影響を及ぼすことがあるので推奨しません。
あるいは、異なる MATLAB セッションで異なるシードを明示的に指定します。たとえば、1 つの MATLAB セッションで乱数を生成します。
rng(1); A = rand(2,2);
別の MATLAB セッションで、異なるシードを使用して乱数を生成します。
rng(2); B = rand(2,2);
配列 A
と B
は異なります。これは、関数 rand
を呼び出すたびに、あらかじめ異なるシードを用いて発生器を初期化しているからです。
オーバーラップが発生しないことが保証されていて、かつストリーム間の値の独立性を実証するテストが実行されている複数の独立したストリームを生成するには、RandStream.create
を使用できます。複数のストリームの生成の詳細については、複数のストリームを参照してください。