Main Content

RandStream

説明

RandStream は、指定した疑似乱数発生器アルゴリズムを使用して乱数ストリームを作成します。

MATLAB® の疑似乱数は、1 つ以上の乱数ストリームから生成できます。乱数の配列を生成する最も簡単な方法は、関数 randrandirandnrandperm を使用することです。これらのすべての関数は、"グローバル ストリーム" として知られている、一様分布の乱数の同じストリームに依存します。グローバル ストリームを変更するのに RandStream を使用できますが、その使用は必須ではありません。RandStream を使用してストリームを作成する場合、RandStream.setGlobalStream を使用して、それをグローバル ストリームにすることができます。しかし、関数 rng の方が、よりシンプルなインターフェイスで、ほとんどのユース ケースに対して十分なグローバル ストリームを作成できます。

また、RandStream を使用してストリームを作成した後、randrandirandn、または randperm を使用して、それらのストリームから乱数を生成することもできます。生成される乱数は、グローバル ストリームまたはその他のストリームから取得される乱数とは別のものになります。詳細については、オブジェクト関数を参照してください。

作成

次の構文は、単一の乱数ストリームを作成するために使用します。複数の独立したストリームを同時に作成する場合は、関数 RandStream.create を使用します。

説明

s = RandStream(gentype) は、gentype で指定された一様疑似乱数発生器アルゴリズムを使用する乱数ストリームを作成します。

s = RandStream(gentype,Name,Value) は、1 つ以上のオプションの Name,Value のペアの引数を使用して、ストリームのプロパティも制御します。

入力引数

すべて展開する

乱数発生器アルゴリズム。乱数発生器の名前を示す文字ベクトルまたは 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 を引用符で囲みます。

例: s = RandStream('mt19937ar','Seed',15,'NormalTransform','Polar')

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

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

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

プロパティ

すべて展開する

乱数ストリーム s は、その動作を制御するプロパティをもっています。p = s.Property を使用してプロパティにアクセスし、s.Property = p を使用してプロパティを変更します。ストリーム s のすべてのプロパティを保存するには A = get(s)、復元するには set(s,A) を使用できます。このリストは、RandStream のプロパティを説明します。

この プロパティ は読み取り専用です。

ストリームが使用する乱数発生器アルゴリズム。発生器とそのプロパティの概要については、発生器アルゴリズムの表を参照してください。

すべての発生器のアルゴリズムが複数のストリームをサポートするとは限りません。統計的に独立した複数のストリームとサブストリームを作成できる発生器もあります。

データ型: char

この プロパティ は読み取り専用です。

ストリームの作成に使用される乱数シード。非負の整数として返されます。

データ型: uint32

この プロパティ は読み取り専用です。

現在のストリームを作成したグループにあるストリーム数。正の整数として返されます。

データ型: uint64

この プロパティ は読み取り専用です。

現在のストリームと共に作成したストリームのグループにおける現在のストリームのインデックス。正の整数として返されます。

データ型: uint64

発生器の現在の内部状態。整数のベクトルとして指定します。状態ベクトルのサイズは、発生器アルゴリズムによって決まります。このプロパティを設定する場合、s.State に割り当てる値は、あらかじめ s.State から読み取った値でなければなりません。State プロパティからあらかじめ読み取らずにストリームを初期の状態に戻すには、reset を使用します。State プロパティを使用して発生器の内部状態を保存し復元することで、乱数列を再現できます。

内部状態により、乱数ストリーム s によって生成される乱数列が決まります。1 つのストリームから乱数を生成するたびに、ストリーム内の発生器の状態が変化し、統計的に独立同一分布する連続値が生成されます。

メモ

乱数ストリームの状態の復元、またはストリームのリセットは、ストリームの結果を再現する場合にのみ行ってください。

データ型: uint32

現在設定しているストリームのサブストリームのインデックス。

発生器の種類によっては、1 つの乱数ストリームから複数の異なるサブストリームを作成できます。異なるサブストリームから生成される値は、相互に独立しています。サブストリームをサポートしている発生器については、発生器アルゴリズムの表を参照してください。

データ型: double

randn を使用して正規分布の疑似乱数値を生成する変換アルゴリズム。

データ型: char

s が対称な疑似乱数値を生成するかどうか。logical true (1) または false (0) として指定します。対称値は、生成される一様分布の既定の疑似乱数値を 1 から減算した値です。

データ型: logical

s が完全精度を使用して値を生成するかどうか。logical true (1) または false (0) として指定します。FullPrecisionfalse の場合、発生器によっては、少ないビット数で疑似乱数を高速に生成することができます。

データ型: logical

オブジェクト関数

既定では、rand などの乱数発生関数はグローバル乱数ストリームを使用します。異なるストリームを指定するには、RandStream オブジェクトを作成し、それを最初の入力引数として渡します。たとえば、SIMD 指向高速メルセンヌ・ツイスターを使用して、乱数の 4 行 1 列のベクトルを作成します。

s = RandStream('dsfmt19937');
r = rand(s,4,1);

これらの関数は、RandStream オブジェクトを受け入れます。

rand一様分布の乱数

サポートされる構文は次のとおりです。ここで、sRandStream オブジェクトです。

X = rand(s)
X = rand(s,n)
X = rand(s,sz1,...,szN)
X = rand(s,sz)
X = rand(s,__,typename)
X = rand(s,__,'like',p)
他の入力引数の詳細については、randrandi、および randn を参照してください。

randi整数の一様分布の疑似乱数
randn正規分布した乱数
randperm整数のランダム置換

サポートされる構文は次のとおりです。ここで、sRandStream オブジェクトです。

p = randperm(s,n)
p = randperm(s,n,k)
他の入力引数の詳細については、randperm を参照してください。

RandStream のその他のオブジェクト関数には、以下があります。

RandStream.create統計的に独立した乱数ストリームを作成
RandStream.list乱数発生器アルゴリズムをリスト
RandStream.getGlobalStream現在のグローバル乱数ストリームを取得
RandStream.setGlobalStreamグローバル乱数ストリームの設定
reset乱数ストリームのリセット

すべて折りたたむ

SIMD 指向高速メルセンヌ・ツイスターを使用して、乱数ストリームを作成します。

s = RandStream('dsfmt19937')
s = 
dsfmt19937 random stream
             Seed: 0
  NormalTransform: Ziggurat

ストリームを使用して、乱数を 5 つ生成します。

rand(s,1,5)
ans = 1×5

    0.0306    0.2131    0.2990    0.3811    0.8635

現在の時間に基づく発生器のシードを使用して、乱数ストリームを作成します。この操作は、MATLAB® が生成する乱数の統計的な特性に影響を与えることがあるため、MATLAB セッションごとに何度も実行することは望ましくありません。

s = RandStream('mt19937ar','Seed','shuffle');

ストリームを使用して、0 ~ 1 の範囲で一様分布する乱数値をもつ 3 行 3 列の行列を作成します。

X1 = rand(s,3)
X1 = 3×3

    0.5289    0.5949    0.7915
    0.0483    0.2385    0.8323
    0.6749    0.6784    0.3007

ストリームから、別の乱数を 5 つ作成します。

X2 = rand(s,1,5)
X2 = 1×5

    0.0296    0.3620    0.1158    0.9043    0.6596

単精度数からなる 2 行 3 列の行列を作成します。

p = single([0.1 -3 2.5; 1.2 -3.4 6]);

シードが 0 の乱数ストリームを作成します。

s = RandStream('mcg16807','Seed',0);

ストリームを使用して、サイズとデータ型が p と同じである乱数の配列を生成します。

z = rand(s,size(p),'like',p)
z = 2x3 single matrix

    0.2190    0.6789    0.9347
    0.0470    0.6793    0.3835

class(z)
ans = 
'single'

シードが 0 の乱数ストリームを作成します。

s = RandStream('mcg16807','Seed',0);

ストリームから、乱数を 5 つ生成します。ストリームから数値を生成するたびに、発生器アルゴリズムは、次に生成される数値が前の数値と独立同一分布するよう、内部状態を変化させます。

u1 = rand(s,1,5)
u1 = 1×5

    0.2190    0.0470    0.6789    0.6793    0.9347

発生器の現在の状態を保存します。別の乱数を 5 つ生成します。

savedState = s.State;
u2 = rand(s,1,5)
u2 = 1×5

    0.3835    0.5194    0.8310    0.0346    0.0535

前回の 5 つの乱数の結果を再現するには、発生器の状態を保存された状態に復元します。

s.State = savedState;
u3 = rand(s,1,5)
u3 = 1×5

    0.3835    0.5194    0.8310    0.0346    0.0535

発生器の状態の読み書きは、ストリームから特定の結果を再現する場合にのみ行ってください。

シードが 3 の乱数ストリームを作成します。ストリームを使用して、乱数を 8 つ生成します。

stream = RandStream('dsfmt19937','Seed',3);
z = rand(stream,1,8)
z = 1×8

    0.2550    0.8753    0.0908    0.1143    0.3617    0.8210    0.8444    0.6189

乱数ストリームを、シードが 3 である初期状態にリセットします。生成された 8 つの乱数を再現します。

reset(stream,3);
z = rand(stream,1,8)
z = 1×8

    0.2550    0.8753    0.0908    0.1143    0.3617    0.8210    0.8444    0.6189

ストリームのシードをリセットすると、他のストリームにより独立性を無効にできます。ストリームのリセットは、ストリームの結果を再現する場合にのみ行ってください。

乱数ストリームを 2 つ作成します。1 つ目のストリームは、RandStream.setGlobalStream を使用して、グローバル ストリームとして設定します。

globalStream = RandStream('mlfg6331_64','NormalTransform','Polar')
globalStream = 
mlfg6331_64 random stream
             Seed: 0
  NormalTransform: Polar

RandStream.setGlobalStream(globalStream);

現在のグローバル ストリームを表示するには、RandStream.getGlobalStream を使用します。

RandStream.getGlobalStream
ans = 
mlfg6331_64 random stream (current global stream)
             Seed: 0
  NormalTransform: Polar

新規作成したグローバル ストリームとは別に動作する 2 つ目のストリーム、myStream を作成します。

myStream = RandStream('dsfmt19937','NormalTransform','Inversion')
myStream = 
dsfmt19937 random stream
             Seed: 0
  NormalTransform: Inversion

グローバル ストリームから乱数を 3 つ生成します。作成したローカル ストリーム myStream から乱数を 3 つ生成します。

randn(1,3)
ans = 1×3

    0.8715    1.0588   -0.6956

randn(myStream,1,3)
ans = 1×3

   -1.8723   -0.7956   -0.5273

関数 randrandnrandimyStream なしで呼び出した場合、グローバル ストリームから取得され、myStream を指定して呼び出した場合の結果には影響を与えません。

発生器の種類によっては、1 つの乱数ストリームから複数の異なるサブストリームを作成できます。異なるサブストリームから生成される値は、相互に独立しています。

たとえば、結合多重再帰発生器を使用して、乱数ストリームを作成します。

s = RandStream('mrg32k3a');

あるストリームを特定のサブストリームに再配置するには、その Substream プロパティを設定します。たとえば、ループで乱数を生成します。ループの各反復の前に、乱数ストリームを別のサブストリームの最初に配置します。5 つの乱数の互いに独立したセットを 3 組生成します。

for i = 1:3
    s.Substream = i;
    z = rand(s,1,5)
end
z = 1×5

    0.7270    0.4522    0.9387    0.2360    0.0277

z = 1×5

    0.5582    0.8527    0.7733    0.0633    0.2788

z = 1×5

    0.1666    0.2924    0.7728    0.8391    0.5107

5 つの乱数の 2 つ目のセットを再現するには、ストリームを対応するストリームに再配置します。

s.Substream = 2;
z = rand(s,1,5)
z = 1×5

    0.5582    0.8527    0.7733    0.0633    0.2788

詳細

すべて展開する

拡張機能

バージョン履歴

R2008b で導入