関連情報

ナビゲーション:前へ   上へ   次へ

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の利用方法を説明します。 シードの格納領域の大きさは環境(コンパイラ)依存ですので、 必ず領域の大きさを取得してから利用する必要があります。 以下にポータブルなコードを作成する手順を示します。

利用の流れ

  1. シード格納領域の配列サイズを取得
  2. 配列領域を確保
  3. シードを取得
  4. 取得されたシードを再利用(同じ乱数シーケンスを得る)

以下に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



ナビゲーション:前へ   上へ   次へ

Results matter. Trust NAG.
Privacy Policy | Trademarks