私はFortranプログラミングの初心者です。誰かが解決策を手伝ってくれませんか。 random_seedとRandを使用して、Fortran乱数の[0,5]の範囲の整数乱数を生成する問題があります。
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
もちろん、非連続整数のセットには他の変換が必要になるため、数値の問題に注意を払う必要があります。
どうですか:
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