このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
RandStream
を使用したグローバル ストリームの管理
関数rand
、randn
randi
、およびrandperm
は、"グローバル ストリーム" と呼ばれる、基礎となっている乱数ストリームから乱数を引き出します。グローバル ストリームは RandStream
オブジェクトです。関数rng
を使用すると、グローバル ストリームを簡単に制御できます。より包括的な制御では、RandStream
クラスによってグローバル ストリームから別個のストリームを作成し、グローバル ストリームのハンドルを取得して、乱数発生を制御できるようになります。
rng
を使用して、乱数発生器を既定のシード (0
) とアルゴリズム (メルセンヌ・ツイスター) に設定します。発生器の設定を保存します。
rng('default')
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