Main Content

RandStream.create

統計的に独立した乱数ストリームを作成

説明

s = RandStream.create(gentype) は、gentype で指定した一様な疑似乱数発生器アルゴリズムを使用する単一の乱数ストリームを作成します。RandStream.list は、gentype のすべての可能な値を返します。発生器アルゴリズムの詳細については、乱数ストリームの作成と管理を参照してください。関数 RandStream は、単一のストリームを作成する必要がある場合の簡潔な代替手段です。

[s1,s2,...] = RandStream.create(gentype,'NumStreams',n)n 乱数ストリームを作成します。ストリームは、疑似乱数の観点で独立しています。ストリームが、別の時点で作成されたストリームから必ずしも独立しているとは限りません。

メモ

すべての発生器タイプが複数のストリームをサポートしているわけではありません。乗法ラグ フィボナッチ発生器 ('mlfg6331_64') または結合多重再帰発生器 ('mrg32k3a') を使用して、複数のストリームを作成します。

[___] = RandStream.create(gentype,Name,Value) は、1 つ以上の Name,Value のペアを使用してストリームの作成を制御します。

すべて折りたたむ

3 つの独立したストリームを作成します。各ストリームから乱数を生成します。それらの相関をチェックします。異なるストリーム間の相関は、分布のサンプリングから計算されているため、厳密には 0 ではありません。

[s1,s2,s3] = RandStream.create('mrg32k3a','NumStreams',3);
r1 = rand(s1,100000,1); 
r2 = rand(s2,100000,1); 
r3 = rand(s3,100000,1);
corrcoef([r1,r2,r3])
ans = 3×3

    1.0000    0.0016   -0.0019
    0.0016    1.0000   -0.0012
   -0.0019   -0.0012    1.0000

3 つの独立したストリームから 1 つのストリームを作成し、グローバル ストリームとして割り当てることもできます。

s2 = RandStream.create('mrg32k3a','NumStreams',3,'StreamIndices',2);
RandStream.setGlobalStream(s2);

グローバル ストリームから乱数を生成します。

r = rand(100000,1);

メソッド RandStream.create を使用して、1 次元のランダム ウォークをシミュレートする 3 つの相互に独立したストリームを作成します。

[s1,s2,s3] = RandStream.create('mrg32k3a','NumStreams',3);

1 つ目のストリームからランダム ウォークを生成します。最初に、それをグローバル ストリームとして設定します。1 つ目のストリームを使用して、標準の正規分布から 5,000 のランダムなステップを生成します。0 の開始位置を選択し、cumsum を使用してランダムなステップの累積和を計算します。結果のランダム ウォークをプロットします。

RandStream.setGlobalStream(s1)
dy1 = randn(5000,1);
y1 = cumsum([0; dy1]);
plot(y1)

Figure contains an axes object. The axes object contains an object of type line.

2 つ目および 3 つ目のストリームを使用してプロセスを繰り返します。結果を同じ座標軸にプロットします。

hold on;
dy2 = randn(s2,5000,1);
y2 = cumsum([0; dy2]);
plot(y2)
dy3 = randn(s3,5000,1);
y3 = cumsum([0; dy3]);
plot(y3)
hold off

Figure contains an axes object. The axes object contains 3 objects of type line.

ストリーム間の相関を計算します。異なるストリーム間の相関は、分布のサンプリングから計算されているため、厳密には 0 ではありません。

C = corrcoef([dy1 dy2 dy3])
C = 3×3

    1.0000   -0.0363    0.0155
   -0.0363    1.0000   -0.0012
    0.0155   -0.0012    1.0000

入力引数

すべて折りたたむ

乱数発生器アルゴリズム。乱数発生器の名前を示す文字ベクトルまたは string スカラーとして指定します。MATLAB® はいくつかの発生器アルゴリズムを提供します。以下の表に、使用可能な発生器アルゴリズムの名前と主要なプロパティの概要を示します。詳細については、乱数ストリームの作成と管理を参照してください。

名前発生器複数のストリームとサブストリームのサポート高精度な場合の近似周期
'mt19937ar'メルセンヌ・ツイスターなし219937-1
'dsfmt19937'SIMD 指向高速メルセンヌ・ツイスター なし219937-1
'mlfg6331_64'乗法ラグ フィボナッチ発生器あり2124 (長さが 272 の 251 個のストリーム)
'mrg32k3a'結合多重再帰発生器あり2191 (長さが 2127 の 263 個のストリーム)
'philox4x32_10'Philox 4x32 発生器、10 ラウンドあり2193 (長さが 2129 の 264 個のストリーム)
'threefry4x64_20'Threefry 4x64 発生器、20 ラウンドあり2514 (長さが 2258 の 2256 個のストリーム)
'shr3cong'線形合同法発生器を組み合わせたシフトレジスタ発生器なし264
'swb2712'修正桁下げ付き減算発生器なし21492
'mcg16807'乗算合同法発生器なし231-2

名前と値の引数

引数のオプションのペアを Name1=Value1,...,NameN=ValueN として指定します。ここで Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後になければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用してそれぞれの名前と値を区切り、Name を引用符で囲みます。

例: RandStream.create('mrg32k3a','NumStreams',3,'StreamIndices',2)

独立したストリームの数。'NumStreams' と正の整数で構成されるコンマ区切りのペアとして指定します。

ストリーム インデックス。'StreamIndices' と、正の整数のベクトルまたは正の整数で構成されるコンマ区切りのペアとして指定します。現在のストリームと作成したストリームのグループにおける現在のストリームのインデックスを付けるためにこのパラメーターを指定します。既定値は 1:N です。ここで、N'NumStreams' の値です。

乱数シード。'Seed' と非負の整数または 'shuffle' で構成されるコンマ区切りのペアとして指定します。シードは、アルゴリズムが乱数を生成する開始点を指定します。'shuffle' は、現在の時刻に基づいてシードを作成します。整数を指定する場合、0 ~ 232 − 1 の値でなければなりません。

MATLAB の起動時またはシミュレーションの実行前にストリームを作成する場合、発生器のシードを初期化手順として指定します。ストリームを再現するには、毎回同じシードを使用します。複数のシードを使用すると、複数の乱数列が作成されますが、異なる乱数列が統計的に独立する保証はありません。この点が重要な場合は、複数の出力とともに RandStream.create を使用して、統計的に独立する複数のストリームを作成します。

randn を使用して乱数ストリームから正規分布した乱数を生成する変換アルゴリズム。'NormalTransform' およびアルゴリズム名 'Ziggurat''Polar'、または 'Inversion' のいずれかで構成されるコンマ区切りのペアとして指定します。

cell 配列を返すオプション。コンマ区切りのペア 'CellOutput' および logical false (0) または true (1) として指定します。'CellOutput'true として指定すると、RandStream.create はストリーム オブジェクトを cell 配列の要素として返します。

ヒント

通常、RandStream.create を 1 回呼び出し、単一パスで、または MATLAB セッションの開始時に複数の独立したストリームを作成します。たとえば、[s1,s2,s3] = RandStream.create('mrg32k3a','NumStreams',3) を使用して 3 つの独立したストリームを作成できます。

または、RandStream.create を別々に呼び出して、各ストリームを作成できますが、gentype'NumStreams''Seed''StreamIndices' の適切な値を指定してこれらの独立性を確保しなければなりません。

  • 各ケースで gentype'NumStreams''Seed' に対して同じ値を指定します。

  • 'StreamIndices' には毎回異なる値を指定します。すべての値は 1'NumStreams' の値にしなければなりません。

たとえば、s1 = RandStream.create('mrg32k3a','NumStreams',5,'Seed',0,'StreamIndices',1)s2 = RandStream.create('mrg32k3a','NumStreams',5,'Seed',0,'StreamIndices',2) を使用して 2 つの独立したストリームを作成します。

バージョン履歴

R2008b で導入