シミュレーション物理7
乱数
今回の授業の目的
• 乱数の発生のさせ方を覚える
• なぜ乱数が重要か?
– 乱数は数値実験の基本
– 自然界の複雑な現象を乱数を使ってまねする
– 温度による雑音,サンプル平均など
乱数の出し方
基本的には大きな整数に大きな整数をかける->次の値が予測が
つかなくなることを利用
4byte整数の範囲:232/2= 2147483648なので大きな整数に大き
な整数をかけると
-2147483648~2147483647
の間に一様に分布することを利用する。これをプログラムで書くと
こうなる。
iran=65539*iran+125654 !大きな整数iranに適当な大きな整数をかける,足す
if(iran<0)iran=iran+2147483647+1 !2147483647を越えると負になるので補正
x=iran/2147483648.0 !結果が0~1の間になるように規格化
この乱数には問題がある
• 一見ランダムに見えて,相関がある。
• 周期も短い
• よってよくできたサブルーチンを利用する。
乱数の分布
• 乱数の分布としてよく使われる二つ
– 一様分布 0~1の間に同じ確率で分布
– 正規分布 釣り鐘状のガウス分布,平均は0,分
散は1に規格化されているものを用意し,用途に
応じて使う
• 実は上手いやり方があり,一様分布乱数2個
から正規分布乱数2個を作ることが出来る
(Box-Muller法)
確率変数の変数変換
x : random, p( x)
y : random, y  f ( x)
dx
| P( y )dy || p( x)dx | P( y )  p( x)
dy
Example : y   log x, x  [0,1]
P( y )  1 exp( y )  exp( y )
変数2個では?
Box-Muller法
 ( x1 , x2 )
p( y1 , y2 )dy1dy2  P ( x1 , x2 )dx1dx2  P ( x1 , x2 )
 ( y1 , y2 )
y1  2 log x1 cos 2 x2
y2  2 log x1 sin 2 x2
1
1
2
2
Jacobian  
exp( y1 / 2)
exp( y2 / 2)
2
2
本日使うプログラム
– KindNumbers.f90 !double precisionを定義
– random.f90 !一様乱数のサブルーチン
– random_uniform.f90 ![0,1]の一様乱数をサブ
ルーチンを使って発生させるメインプログラム
– random_gauss.f90 ! 上の正規分布(平均0,分
散1)バージョン
– 講義ノートのページからrandom.tarをPCにダウン
ロードして、dahlmanにアップロード
– tar xvf random.tar
で解凍する
実行のさせ方
• まずモジュールをコンパイル
f90 –c KindNumbers.f90
f90 –c random.f90
• 実行ファイルを作る
f90 –o randomuniform random_uniform.f90
KindNumbers.o random.o
f90 –o randomgauss random_gauss.f90
KindNumbers.o random.o
• 次に実行
randomuniform
randomgauss
課題
• 乱数を1000個発生させ,このヒストグラムを
作る。一様乱数,正規分布乱数両方とも。(乱
数を画面でなくファイルに書きだし,それをエ
クセルで解析すればよい。分析ツールを使う。
0.2間隔の列を作りそれを範囲として選択す
る。(列ごとは選ばない。出力は他のシートに
する。))
• 乱数を使って円周率を求めるプログラムを作
る。やり方は黒板で説明。これは提出課題
(12月末までに提出)。
ダウンロード

7回目の講義ノート