web-dev-qa-db-ja.com

[0,5]の範囲のFortran90で整数乱数を生成する方法は?

私はFortranプログラミングの初心者です。誰かが解決策を手伝ってくれませんか。 random_seedとRandを使用して、Fortran乱数の[0,5]の範囲の整数乱数を生成する問題があります。

9
user3531410

Alexander Vogtによる answer をサポートするために、一般化します。

組み込み関数random_number(u)は、区間[0,1)の一様分布から実数u(またはその配列)を返します。 [つまり、0は含まれますが、1は含まれません。]

整数{n、n + 1、...、m-1、m}に離散一様分布を持たせるには、連続分布をm + 1-nの等しいサイズのチャンクに分割し、各チャンクを整数にマッピングします。 1つの方法は次のとおりです。

call random_number(u)
j = n + FLOOR((m+1-n)*u)  ! We want to choose one from m-n+1 integers

ご覧のとおり、{0、1、2、3、4、5}の最初の質問では、これは次のようになります。

call random_number(u)
j = FLOOR(6*u)            ! n=0 and m=5

そしてあなたのコメントの他のケースについては{-1、0、1}

call random_number(u)
j = -1 + FLOOR(3*u)       ! n=-1 and m=1

もちろん、非連続整数のセットには他の変換が必要になるため、数値の問題に注意を払う必要があります。

5
francescalus

どうですか:

program Rand_test
  use,intrinsic :: ISO_Fortran_env
  real(REAL32)  :: r(5)
  integer       :: i(5)

  ! call init_random_seed() would go here

  call random_number(r)

  ! Uniform distribution requires floor: Thanks to @francescalus 
  i = floor( r*6._REAL32 )

  print *, i
end program
4
Alexander Vogt