Main Content

再現可能な乱数の生成

発生器のアルゴリズムとシードの指定

この例では、最初に発生器のアルゴリズムとシードを指定することにより乱数の配列を繰り返し作成する方法を示します。毎回同じアルゴリズムとシードを使用して発生器を初期化することにより、常に同じ結果が得られます。

まず、乱数発生器を初期化してこの例の結果を再現可能にします。たとえば、次のコードはシードを 1 に、発生器のアルゴリズムをメルセンヌ・ツイスターに設定します。

rng(1,"twister");

次に、乱数の配列を作成します。

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,"twister");
A = rand(3,3)
A =

    0.4170    0.3023    0.1863
    0.7203    0.1468    0.3456
    0.0001    0.0923    0.3968

以下のような場合には、シードと発生器のタイプを共に設定します。

  • 将来の MATLAB® リリースで実行したときに、今日作成したコードの動作で返されるものと同じ結果が必ず返されるようにする。

  • 現在のリリースを使用しても、以前の MATLAB リリースで作成したコードの動作で返されるものと同じ結果が必ず返されるようにする。

  • 自分以外が作成した乱数コードの実行後に、自分のコードで乱数を繰り返し生成する。

使用可能な発生器の一覧は、rng のリファレンス ページを参照してください。

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

発生器設定の保存と復元

この例では、乱数発生器の設定を保存して復元することにより、再現可能な乱数の配列を作成する方法を示します。発生器の設定の保存と復元を行う最も一般的な理由は、アルゴリズムや反復の特定ポイントで生成される乱数を再現することです。たとえば、デバッグの補助として発生器の設定を使用できます。発生器を再初期化する再シードとは異なり、この方法は発生器の設定を任意の時点で保存、復元できます。

まず、乱数発生器を初期化してこの例の結果を再現可能にします。

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

参考

関連するトピック