再現可能な乱数の生成
シードの指定
この例では、はじめにシードを指定することにより乱数の配列を繰り返し作成する方法を示します。毎回同じシードを使用して乱数発生器を初期化することにより、常に同じ結果が得られます。
まず、乱数発生器を初期化してこの例の結果を再現可能にします。
rng('default');
シード 1
を使用して乱数発生器を初期化します。
rng(1);
次に、乱数の配列を作成します。
A = rand(3,3)
A = 0.4170 0.3023 0.1863 0.7203 0.1468 0.3456 0.0001 0.0923 0.3968
同じコマンドを繰り返します。
A = rand(3,3)
A = 0.5388 0.2045 0.6705 0.4192 0.8781 0.4173 0.6852 0.0274 0.5587
rand
の最初の呼び出しにより発生器の状態が変化したため、2 回目の結果は異なったものとなります。
ここで、前と同じシードを使用して乱数発生器を再初期化し、続いて最初の行列 A
を再現します。
rng(1); A = rand(3,3)
A = 0.4170 0.3023 0.1863 0.7203 0.1468 0.3456 0.0001 0.0923 0.3968
場合によっては、シードのみを設定するだけでは同じ結果が保証されないことがあります。これは、乱数関数の値の取得先となる乱数発生器が、コード実行に際して予想とは異なったものとなる場合があるからです。長期的に反復が可能となるようにするには、シードと乱数発生器のタイプを共に指定します。
たとえば、次のコードはシードを 1
に、乱数発生器をメルセンヌ・ツイスターに設定します。
rng(1,'twister');
以下のような場合には、シードと発生器のタイプを共に設定します。
将来の MATLAB® リリースで実行したときに、今日作成したコードの動作で返されるものと同じ結果が必ず返されるようにする。
現在のリリースを使用しても、以前の MATLAB リリースで作成したコードの動作で返されるものと同じ結果が必ず返されるようにする。
自分以外が作成した乱数コードの実行後に、自分のコードで乱数を繰り返し生成する。
使用可能な発生器の一覧は、rng
のリファレンス ページを参照してください。
発生器設定の保存と復元
この例では、乱数発生器の設定を保存して復元することにより、再現可能な乱数の配列を作成する方法を示します。発生器の設定の保存と復元を行う最も一般的な理由は、アルゴリズムや反復の特定ポイントで生成される乱数を再現することです。たとえば、デバッグの補助として発生器の設定を使用できます。発生器を再初期化する再シードとは異なり、この方法は発生器の設定を任意の時点で保存、復元できます。
まず、乱数発生器を初期化してこの例の結果を再現可能にします。
rng(1,'twister');
1 ~ 10 の整数値の乱数からなる配列を作成します。
A = randi(10,3,3)
A = 3×3
5 4 2
8 2 4
1 1 4
randi
の最初の呼び出しにより発生器の状態が変化しました。randi
の最初の呼び出し後、発生器の設定を構造体 s
に保存します。
s = rng;
1 ~ 10 の整数値の乱数からなるもう 1 つの配列を作成します。
A = randi(10,3,3)
A = 3×3
6 3 7
5 9 5
7 1 6
ここで、発生器を s
に保存されている以前の状態に戻し、2 つめの配列 A
を再現します。
rng(s); A = randi(10,3,3)
A = 3×3
6 3 7
5 9 5
7 1 6