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)

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

ストリーム間の相関を計算します。異なるストリーム間の相関は、分布のサンプリングから計算されているため、厳密には 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'メルセンヌ・ツイスター (MATLAB 起動時に既定のストリームによって使用)なし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

名前と値のペアの引数

オプションの Name,Value の引数ペアをコンマ区切りで指定します。Name は引数名で、Value は対応する値です。Name は引用符で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を任意の順序で指定できます。

例: 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 で導入