最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。
乱数ストリーム
MATLAB® の疑似乱数は、1 つまたは複数の乱数ストリームからなります。乱数の配列を生成する最も簡単な方法は、関数 rand
、randn
、または randi
を使用することです。これらのすべての関数は、グローバル ストリームとして知られている、一様乱数の同じストリームに依存します。グローバル ストリームから別々に機能する他のストリームを作成することができ、乱数の配列を生成するために、それらの rand
、randi
、または randn
メソッドを使用することができます。さらに、乱数ストリームを作成し、それをグローバル ストリームにすることも可能です。
単一の乱数ストリームを作成するには、RandStream
コンストラクターを使用します。複数の独立した乱数ストリームを作成するには、RandStream.create
を使用します。関数 rng
を使用すると、新しいグローバル ストリームを作成するための簡単なインターフェイスを利用できます。
stream = RandStream.getGlobalStream
はグローバル乱数ストリーム、すなわち関数 rand
、randi
、および randn
で現在使用されているものを返します。
prevstream = RandStream.setGlobalStream(stream)
は、乱数ストリーム stream
を関数 rand
、randi
、および randn
で使用される新たなグローバル ストリームとして指定し、前のグローバル ストリームを返します。
乱数ストリーム s
は、その動作を制御するプロパティをもっています。p = s.Property
または s.Property = p
を使用して、プロパティのアクセスまたは割り当てを行います。下表に定義されたプロパティを示します。
プロパティ | 説明 |
---|---|
Type | (参照のみ) ストリームが使用する発生器のアルゴリズム。利用可能な発生器のリストは、RandStream.list によって与えられます。 |
Seed | (参照のみ) ストリームの生成に使用する seed 値 |
NumStreams | (参照のみ) 現在のストリームを作成したグループにあるストリーム数 |
StreamIndex | (参照のみ) 現在のストリームと共に作成したストリームのグループにおける現在のストリームのインデックス |
State | 発生器の内部状態。このプロパティの形式に依存しません。 乱数ストリーム |
Substream | 現在設定しているストリームのサブストリームのインデックス。既定の設定は 1 です。複数のサブストリームはすべての発生器でサポートされているとは限りません。乗法ラグ フィボナッチ発生器 (mlfg6331_64 ) と結合多重再帰発生器 (mrg32k3a ) はサブストリームをサポートしています。 |
NormalTransform | 正規分布から疑似乱数値を生成するために、randn(s, ...) が使用する変換アルゴリズム。使用可能な値は 'Ziggurat' 、'Polar' または 'Inversion' です。 |
Antithetic | S が対称な疑似乱数 (1 から通常値を減算したもの) を生成するかどうかを示す論理値。既定値は false です。 |
FullPrecision | S が高精度な値を生成しているかを判定する論理値。FullPrecision が false の場合、いくつかの発生器は少ないビット数で疑似乱数を高速に生成することができます。既定の設定は true です。 |
メソッド | 説明 |
---|---|
RandStream | 乱数ストリームを作成します。 |
RandStream.create | 複数の独立した乱数ストリームを作成します。 |
get | 乱数ストリーム オブジェクトのプロパティを取得します。 |
list | 使用可能な乱数発生器のアルゴリズムをリストします。 |
set | 乱数ストリーム プロパティを設定します。 |
RandStream.getGlobalStream | グローバル乱数ストリームを取得します。 |
RandStream.setGlobalStream | グローバル乱数ストリームを設定します。 |
reset | ストリームを初期の内部状態にリセットします。 |
rand | 一様分布からの疑似乱数。 |
randn | 標準正規分布からの疑似乱数。 |
randi | 離散一様分布からの整数の疑似乱数。 |
randperm | 値を不規則に並べ替えます。 |
単一のストリームを作成し、それを現在のグローバル ストリームに指定する:
s = RandStream('mt19937ar','Seed',1); RandStream.setGlobalStream(s);
3 つの独立ストリームを作成する:
[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])
3 つの独立したストリームの集合から 1 つのストリームを作成し、それを現在のグローバル ストリームとして指定する:
s2 = RandStream.create('mrg32k3a','NumStreams',3,... 'StreamIndices',2); RandStream.setGlobalStream(s2);
前の結果を再生するために、rand
、randi
、および randn
に基づくグローバル乱数ストリームを元の状態にリセットする:
stream = RandStream.getGlobalStream; reset(stream);
rand
の出力を再生するために、現在のグローバル ストリームの状態を保存して復元する:
stream = RandStream.getGlobalStream; savedState = stream.State; u1 = rand(1,5) u1 = 0.8147 0.9058 0.1270 0.9134 0.6324 stream.State = savedState; u2 = rand(1,5) u2 = 0.8147 0.9058 0.1270 0.9134 0.6324
u2
は、u1
とまったく同じ値を含みます。グローバル乱数ストリームを初期の設定値にリセットする。こうすることで、新しい MATLAB セッションと同様に、rand
、randi
、および randn
が再開されます。
s = RandStream('mt19937ar','Seed',0); RandStream.setGlobalStream(s);
seed を使用することにより、グローバル乱数ストリームを現在の時間に基づいて再初期化する。こうすることで、rand
、randi
、および randn
は、MATLAB セッションが変わるたびに異なる値を返します。この操作は、MATLAB が生成する乱数の統計的な特性に影響を与えることがあるため、MATLAB セッションごとに何度も実行することは望ましくありません。
s = RandStream('mt19937ar','Seed','shuffle'); RandStream.setGlobalStream(s);
一様な値から正規分布の疑似乱数値を作成するために、randn
が使用する変換アルゴリズムを変更する。この操作を行ってもグローバル ストリームが置き換えられたり、リセットされたりしません。
stream = RandStream.getGlobalStream; stream.NormalTransform = 'inversion'