LoginSignup
0
0

More than 5 years have passed since last update.

fortranで擬似乱数の生成

Last updated at Posted at 2015-12-24

はじめに

fortranでの擬似乱数生成は,random_numberを呼び出すことで行うことができる.

real(4) :: harvest
call random_number(harvest)

得られる.コンパイラ依存があるかもしれないが,ifortでは,これで0-1の間の乱数を得られた.
しかし,これだけだと,毎回同じ乱数が生成されてしまうので,その回避法をメモ.

seedのセットによる回避

以下のコードで,毎回異なる擬似乱数を得ることが出来た.

real(4) :: harvest
integer(4), allocatable :: seed(:)
integer(4) :: c, sz

call random_seed( size = sz ) !コンパイラによってシードの配列サイズが異なるので,まずはシードの配列サイズを取得する.
allocate( seed(sz) ) !得られたサイズでseedをallocateする.
call random_seed( get = seed ) !デフォルトでセットされているシードを取得する.
call system_clock( count = c ) !システム時刻を取得して,
seed(1) = c                    !シードにその時刻を使用することで,毎回異なる乱数となるようにする.
call random_seed( put = seed ) !組み直したシードを設定する.
call random_munber(harvest) !擬似乱数の取得

deallocate( seed ) !最後はメモリ解放を忘れずに

今回は

seed(1) = c

としているが,別に配列のどこを変えても乱数は異なるようになるみたいだった.それから,もしかしたら

call random_seed( get = seed )

はいらないかもしれない.
なお,シード(種)とは,擬似乱数生成のためのパラメータで,この値を基に擬似乱数を生成している.

おまけ(毎回同じ擬似乱数を取得する)

余談だが,毎回同じ擬似乱数を取得するには,

call random_seed( get = seed )

で得られたシードを保存しておいて,乱数生成の直前に,

call random_seed( put = seed )

とすれば良いらしい.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0