Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

異なる乱数の生成

この例では、MATLAB® を再起動した際に同じ乱数の配列が繰り返されないようにする方法を示します。この手法は、異なる MATLAB セッションで実行した同じ乱数コマンドの結果を組み合わせる場合に便利です。

乱数関数 randrandnrandirandperm はすべて、共有の乱数発生器から値を取得します。MATLAB を起動するたびに、発生器は既定のアルゴリズムとシードを使用して同じ状態にリセットされます。このため、乱数発生器について同じ基本設定が構成されている異なる MATLAB セッションで起動直後に rand(2,2) のようなコマンドを実行すると、いつでも同じ結果が返されます。また、乱数関数を呼び出すスクリプトや関数はいずれも、再起動後には同じ結果を返します。

初めて MATLAB セッションを開始するか rng("default") を呼び出したときに、MATLAB は、既定のアルゴリズムとシードを使用して乱数発生器を初期化します。R2023b 以降では、MATLAB の基本設定で既定のアルゴリズムとシードを設定できます。該当する基本設定を変更しなかった場合、rng は、以前のリリースと同様に、出荷時の値としてメルセンヌ・ツイスター発生器の "twister"、シード 0 を使用します。詳細については、乱数発生器の既定の設定乱数発生器の再現性を参照してください。

異なる乱数を取得する 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);

配列 AB は異なります。これは、関数 rand を呼び出すたびに、あらかじめ異なるシードを用いて発生器を初期化しているからです。

オーバーラップが発生しないことが保証されていて、かつストリーム間の値の独立性を実証するテストが実行されている複数の独立したストリームを生成するには、RandStream.createを使用できます。複数のストリームの生成の詳細については、複数のストリームを参照してください。

参考

関連するトピック