#乱数を生成
Fortranには簡易的な乱数を生成するための組み込み手続きがあります。
rnd.f90
double precision :: rnd !スカラ,または配列
call random_number(rnd)
random_number
は、0~1の範囲の乱数を生成します。rnd
には、実数のスカラー、または配列を指定します。
しかし、このままだと実行する度に毎回同じ乱数の値の組み合わせが生成されます。これは、乱数生成に使われる初期値が、実行の度にリセットされるからです。
#乱数生成の初期値を変更する
この初期値の設定には、以下の組み込み手続きを使います。
call random_seed(size,put,get)
!size:初期値のサイズを取得
!put :初期値を入力
!get :初期値の取得
この初期値には配列が用いられ、そのサイズはコンパイラに依存します。(参照:乱数発生の組み込み手続)
#実行するたびに、異なる乱数を生成
乱数生成の初期値を、時間によって変更することで、簡易的な乱数を生成します。
rnd.f90
double precision,intent(out) :: rnd
integer :: seedsize, i
integer, allocatable :: seed(:)
call random_seed(size=seedsize) !初期値のサイズを取得
allocate(seed(seedsize)) !配列の割り当て
do i = 1, seedsize
call system_clock(count=seed(i)) !時間を取得
end do
call random_seed(put=seed(:)) !初期値を与える
do i = 1,10
call random_number(rnd)
write(*,*) rnd
end do
call random_number(rnd)
を行う前に、seed
を一度だけ与えておくことで、実行ごとに異なる乱数を呼び出すことができました。
以下の記事を参考にしました。
fortran での擬似乱数生成