前へ 上へ 次へ
前へ 上へ 次へ
11 乱数発生の組込み手続random_number
Fortranで乱数発生を行うための組込み手続に random_number があります。 ここではその利用例を示します。
【書式】 call random_number(harvest) ※harvestは実数(単精度、倍精度、等)のスカラもしくは配列を指定します。 ※harvestはintent(out)属性を持ち、ここに乱数が格納されます。
random_numberの引数は上記の通り配列でもスカラでもかまいません。 また実数であれば単精度、倍精度等何でも指定可能です。
random_numberは与えられた引数に乱数を与えて復帰します。以下にサンプルコードを示します。
[ random.f90 ] - 乱数発生のサンプル
program random implicit none integer,parameter :: n = 4 real :: x(n) call random_number(x) print *, x end program random
出力例: 0.1431407 0.7660621 0.2057434 0.9288544
11.1 random_seedの使い方
乱数のシードを設定するにはrandom_seed組込み手続を利用しますが、 若干シンプルでない部分がありますので以下にrandom_seedの利用方法を説明します。 シードの格納領域の大きさは環境(コンパイラ)依存ですので、 必ず領域の大きさを取得してから利用する必要があります。 以下にポータブルなコードを作成する手順を示します。利用の流れ
- シード格納領域の配列サイズを取得
- 配列領域を確保
- シードを取得
- 取得されたシードを再利用(同じ乱数シーケンスを得る)
以下にrandom_seedの仕様を示します。
【書式】 random_seed( [size] [put] [get] ) size (intent(out)) : シードを格納するのに必要な配列サイズを取得します。 put (intent(in)) : シードを設定します。 get (intent(out)) : 現在のシードを取得します。
以下に上記の手順に基づいたサンプルコードを示します。
[ random-seed.f90 ] - random_seedの利用方法のサンプル
program random_seed_example implicit none integer,parameter :: n = 5 real :: x integer i, seedsize integer,allocatable:: seed(:) call random_seed(size=seedsize) ! シードの格納に必要なサイズを取得する allocate(seed(seedsize)) ! シード格納領域を確保 call random_seed(get=seed) ! 次回同じ乱数を発生できるように print *, "Size of seed array is", seedsize print *, "1st try..." do i = 1, n call random_number(x) print *, i, x end do call random_seed(put=seed) ! 前回と同じシードを設定 print *, "2nd try..." do i = 1, n call random_number(x) print *, i, x end do end program random_seed_example
実行例: Size of seed array is 630 1st try... 1 0.7090818 2 0.5373439 3 0.1391851 4 0.2833014 5 0.4468124 2nd try... 1 0.7090818 2 0.5373439 3 0.1391851 4 0.2833014 5 0.4468124
前へ 上へ 次へ