|
3.2.3 擬似乱数

擬似乱数の生成
3擬似乱数からなるリストを作る.
In[1]:= Table[Random[ ], {3}]
Out[1]= 
30桁の実数値からなる乱数を発生させる.範囲を0から1に限る.
In[2]:= Random[Real, {0, 1}, 30]
Out[2]= 
100以上200以下の範囲で整数乱数を8つ発生させる.
In[3]:= Table[Random[Integer, {100, 200}], {8}]
Out[3]= 
Random[ ]を繰返し使うことで,特定なパターンに従わない「典型的な」,つまり一般的な数列を得ることができる.このような乱数列は各種の計算用途で使われる.
擬似乱数の一般的な用途として,仮定の数値的な判定への応用がある.例えば,2つのシンボル式が数学的に等しいかどうかを判定するとする.これは,「典型的な」数値をシンボル的パラメータに代入し,数値的な2つの結果を比較することで行うことができる.(ただし,数値精度の問題や,多価複素関数を扱った問題では,このような比較の解釈には注意を要する.)
シンボル的な等式を入力する.
In[4]:= Sin[Cos[x]] == Cos[Sin[x]]
Out[4]= 
乱数を代入すると,この等式が常に成り立つとは限らないことが分かる.
In[5]:= % /. x -> Random[ ]
Out[5]= 
擬似乱数の他の一般的用途として,確率的現象のシミュレーションやサイズの大きい母集団からの標本抽出がある. Mathematicaの生成する乱数は指定された範囲で必ず一様に分布するようになっている.
関数 Randomは他のほとんどの組込み関数と違った特徴を持っている.つまり,使われるたびに潜在的な出力値は違ってくる.したがって,計算で Randomを使うと,答は使うたびに違ってくる.
Random[ ]で得られる数列は厳密には「真の乱数」ではないが,実用上「十分に乱数的」である.乱数列は,特定の「種(シード)」を開始点として,特定の数学アルゴリズムを適用することで生成される.同じシードが与えられたなら,同じ乱数からなる系列が得られる.
Mathematicaが起動されたときの時間が(秒以下の精度で記録される)読み込まれ,擬似乱数ジェネレータのシードとして保存される.このため,Mathematicaを別に起動すれば,擬似乱数列はほとんどいつでも違うものになる.
ここで,毎回必ず同じ乱数系列を使いたいのであれば,同じシードをその都度添加する.このように特別にシードの添加を行うには SeedRandomを使う.
擬似乱数ジェネレータにシードを添加し直す.
In[6]:= SeedRandom[143]
3つの擬似乱数を発生させる.
In[7]:= Table[Random[ ], {3}]
Out[7]= 
同じシードを再添加する.すると,前と同じ乱数列が得られる.
In[8]:= SeedRandom[143]; Table[Random[ ], {3}]
Out[8]= 
Randomが呼び出されるたびに,それに対応する擬似乱数ジェネレータの内部状態は変わる.主となる計算で Randomを使っていて,2次的な計算でさらに Randomを使うと2次計算の乱数発生でジェネレータの状態が変わってしまい,主計算に戻ったときに影響が出るかもしれない.これを防ぐには,ジェネレータの状態を記録した変数 $RandomStateの値を主計算であらかじめ保存しておき,これを2次計算が終了した時点で戻す,という手順を踏む.
リストが生成された後に,擬似乱数ジェネレータの内部状態を復元することができる.
In[9]:= {Block[{$RandomState}, {Random[ ], Random[ ]}], {Random[ ], Random[ ]}}
Out[9]= 
|