Help us understand the problem. What is going on with this article?

fortranで擬似乱数の生成

More than 3 years have passed since last update.

はじめに

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 )

とすれば良いらしい.

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした