ドキュメンテーション センター

  • 評価版
  • 製品アップデート

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

グローバル ストリームの管理

関数 rand、関数 randn、関数 randi は、内部の乱数ストリーム (グローバル ストリーム) から乱数を引き出します。関数 rng を使用すると、グローバル ストリームを簡単に制御できます。より包括的な制御の場合、RandStream クラスでグローバル ストリームへのハンドルを取得し、乱数発生を制御することができます。

以下のようにして、グローバル ストリームのハンドルを取得します。

globalStream = RandStream.getGlobalStream
globalStream = 

mt19937ar random stream (current global stream)
             Seed: 0
  NormalTransform: Ziggurat

get メソッドでストリームのプロパティを返します。

get(globalStream)
             Type: 'mt19937ar'
       NumStreams: 1
      StreamIndex: 1
        Substream: 1
             Seed: 0
            State: [625x1 uint32]
  NormalTransform: 'Ziggurat'
       Antithetic: 0
    FullPrecision: 1

次に関数 rand を使用し、グローバル ストリームから一様な乱数を生成します。

rand(1,5);

関数 randnrandi を使用して、グローバル ストリームから正規乱数と整数乱数を生成します。

A = randi(100,1,5);
A = randn(1,5);

State プロパティは、発生器の内部状態を設定します。globalStreamState は保存することができます。

myState = globalStream.State;

myState を使うと、globalStream の状態を保存し、実行結果を再現することができます。

myState = globalStream.State;
A = rand(1,100);
globalStream.State = myState;
B=rand(1,100);
isequal(A,B)

ans =

     1

rand, randi, randn はグローバル ストリームにアクセスします。これらすべての関数は同じストリームにアクセスするため、呼び出した関数の生成値は前に呼び出した関数の影響を受けます。

globalStream.State = myState;
A = rand(1,100);
globalStream.State = myState;
randi(100);
B = rand(1,100);
isequal(A,B)

ans =

     0

グローバル ストリームは RandStream クラスのハンドル オブジェクトで、RandStream.getGlobalStream はハンドルを返します。グローバル ストリームのプロパティは参照したり、ストリームへの任意のハンドルを使って変更することができます。

stream1=RandStream.getGlobalStream;
stream2=RandStream.getGlobalStream;
stream1.NormalTransform='Polar';
stream2.NormalTransform
ans =

Polar

次の表は、RandStream クラスで使用できるメソッドを示します。静的メソッドは、構文 RandStream.methodName で表します。

メソッド説明
RandStream乱数ストリームの作成
RandStream.create複数の独立した乱数ストリームの作成
get乱数ストリームのプロパティの取得
RandStream.list使用可能な乱数発生アルゴリズムの一覧表示
RandStream.getGlobalStreamグローバル乱数ストリームの取得
RandStream.setGlobalStreamグローバル乱数ストリームの設定
set乱数ストリームのプロパティの設定
reset初期の内部状態に対するストリームのリセット
rand一様分布からの疑似乱数の生成
randn標準正規分布からの疑似乱数の生成
randi離散一様分布からの疑似整数乱数の生成
randperm値のランダムな並べ替え

乱数ストリームのプロパティを次の表に示します。

プロパティ説明
Type(読み取り専用) ストリームが使用する発生器のアルゴリズム。RandStream.list は使用可能な発生器を指定します。
Seed(読み取り専用) ストリームの生成に使用する seed 値
NumStreams(読み取り専用) 現在のストリームを作成したグループにあるストリーム数
StreamIndex(読み取り専用) 現在のストリームと共に作成したストリームのグループにおける現在のストリームのインデックス
State発生器の内部状態。このプロパティの形式は変更しないでください。S.State に代入する値は、必ず S.State から読み込んだ値にします。
Substream現在設定しているストリームのサブストリームのインデックス。既定値は 1 です。複数のサブストリームはすべての発生器でサポートされているとは限りません。乗法ラグ フィボナッチ発生器 (mlfg6331_64) と複数の再帰発生器の組み合わせ (mrg32k3a) はサブストリームをサポートしています。
NormalTransform正規分布から疑似乱数を生成するために randn(s, ...) が使用する変換アルゴリズム。使用可能な値は 'Ziggurat''Polar''Inversion' です。
RandnAlg

RandnAlg は削除されました。代わりに NormalTransform を使用してください。

正規分布から疑似乱数を生成するために randn(S, ...) が使用する変換アルゴリズム。オプションは 'Ziggurat' 'Polar'、または 'Inversion' です。

AntitheticS が対称な疑似乱数を生成しているかを判定する論理値。一様な値の場合、対称な疑似乱数は 1 から通常の値を減算した値です。既定値は false です。
FullPrecisions が高精度な値を生成しているかを判定する論理値。FullPrecision が false の場合、いくつかの発生器は少ないビット数で疑似乱数を高速に生成することができます。既定は true です。

シミュレーションを繰り返す場合を考えます。RandStream クラスを使用すると、いくつかの方法で出力を複製できます。前の例で示したようにグローバル ストリームの状態は、保存することができます。

myState=GlobalStream.State;
A=rand(1,100);
GlobalStream.State=myState;
B=rand(1,100);
isequal(A,B)

ans =

     1

reset メソッドを使用してストリームを初期設定にリセットすることもできます。

reset(GlobalStream)
A=rand(1,100);
reset(GlobalStream)
B=rand(1,100);
isequal(A,B)

ans =

     1

乱数のデータ型

randrandn は、既定では倍精度の値を生成します。

GlobalStream=RandStream.getGlobalStream;
myState=GlobalStream.State;
A=rand(1,5);
class(A)

ans =

double

クラスを倍精度に明示的に指定するには、以下のようにします。

GlobalStream.State=myState;
B=rand(1,5,'double');
class(B)

ans =

double
isequal(A,B)

ans =

     1

randrandn は単精度の値を生成することもできます。

GlobalStream.State=myState;
A=rand(1,5,'single');
class(A)
ans =

single

上の例の結果に倍精度値を入力しても出力値は等価です。関数が値を引き出す乱数ストリームは、戻る値のクラスに関係なく、同じ方法を実行します。

A,B

A =

    0.8235    0.6948    0.3171    0.9502    0.0344


B =

    0.8235    0.6948    0.3171    0.9502    0.0344

randi は単精度/倍精度と整数のタイプをサポートしています。

A=randi([1 10],1,5,'double');
class(A)

ans =

double
B=randi([1 10],1,5,'uint8');
class(B)

ans =

uint8
この情報は役に立ちましたか?