Main Content

RandStream を使用したグローバル ストリームの管理

関数randrandnrandi、およびrandpermは、"グローバル ストリーム" と呼ばれる、基礎となっている乱数ストリームから乱数を引き出します。グローバル ストリームは RandStream オブジェクトです。関数rngを使用すると、グローバル ストリームを簡単に制御できます。より包括的な制御では、RandStreamクラスによってグローバル ストリームから別個のストリームを作成し、グローバル ストリームのハンドルを取得して、乱数発生を制御できるようになります。

rng を使用して乱数発生器を初期化します。発生器のシードを 0、発生器のアルゴリズムをメルセンヌ・ツイスターに設定します。発生器の設定を保存します。

rng(0,'twister')
s = rng
s = struct with fields:
     Type: 'twister'
     Seed: 0
    State: [625x1 uint32]

0 ~ 1 の間の一様分布の乱数値からなる 1 行 6 列の行ベクトルを作成します。

x = rand(1,6)
x = 1×6

    0.8147    0.9058    0.1270    0.9134    0.6324    0.0975

RandStream.getGlobalStreamを使用してグローバル ストリームのハンドル、すなわち、rand が乱数の生成元とする現在のグローバル ストリームを返します。RandStream.getGlobalStream を使用してグローバル ストリームのハンドルを取得すれば、rng を使用してグローバル ストリームに加えた変更を確認できます。

globalStream = RandStream.getGlobalStream
globalStream = 
mt19937ar random stream (current global stream)
             Seed: 0
  NormalTransform: Ziggurat

発生器のシードとアルゴリズムを変更し、新しい乱数行ベクトルを作成します。rand が乱数の生成元とする、現在のグローバル ストリームを表示します。

rng(1,'philox')
xnew = rand(1,6)
xnew = 1×6

    0.5361    0.2319    0.7753    0.2390    0.0036    0.5262

globalStream = RandStream.getGlobalStream
globalStream = 
philox4x32_10 random stream (current global stream)
             Seed: 1
  NormalTransform: Inversion

次に、発生器を元の設定に戻し、乱数ベクトルを作成します。結果は、初期の発生器を使用して作成された元の行ベクトル x と一致します。

rng(s)
xold = rand(1,6)
xold = 1×6

    0.8147    0.9058    0.1270    0.9134    0.6324    0.0975

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

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

r = rand(myStream,1,6)
r = 1×6

    0.0306    0.2131    0.2990    0.3811    0.8635    0.1334

myStream を最初の入力引数として関数 rand を呼び出した場合、myStream から数値が引き出され、グローバル ストリームの結果には影響しません。

myStream をグローバル ストリームに設定する場合、オブジェクト関数 RandStream.setGlobalStream を使用できます。

RandStream.setGlobalStream(myStream)
globalStream = RandStream.getGlobalStream
globalStream = 
dsfmt19937 random stream (current global stream)
             Seed: 0
  NormalTransform: Ziggurat

多くの場合、グローバル ストリームの制御には関数 rng だけで足りますが、RandStream クラスを使用することで、正規乱数値に使用されるアルゴリズムの選択など、いくつかの高度な機能を制御できます。

たとえば、randn を使用する際に、RandStream オブジェクトを作成し、正規分布の疑似乱数値を生成するための変換アルゴリズムを指定します。既定の Ziggurat 変換アルゴリズムの代わりに Polar 変換アルゴリズムを使用して、正規分布の疑似乱数値を生成します。

myStream = RandStream('mt19937ar','NormalTransform','Polar')
myStream = 
mt19937ar random stream
             Seed: 0
  NormalTransform: Polar

myStream をグローバル ストリームとして設定します。グローバル ストリームから正規分布の 6 つの乱数を作成します。

RandStream.setGlobalStream(myStream)
randn(1,6)
ans = 1×6

    0.2543   -0.7733   -1.7416    0.3686    0.5965   -0.0191

参考

|

関連するトピック