如何在[0,5]范围内的fortran 90中生成整数随机数?

use*_*410 9 random fortran integer numbers

我在fortran prramming中有点新鲜.任何人都可以帮我解决这个问题.我有一个问题,使用random_seed和rand生成fortran随机数范围[0,5]中的整数随机数

Ale*_*ogt 5

关于什么:

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
Run Code Online (Sandbox Code Playgroud)

  • 然后使用 `real :: ...` 和 `6.`。但是,请帮自己一个忙并切换到明确的定义! (2认同)

fra*_*lus 5

为了支持Alexander Vogt 的回答,我将进行概括。

内部函数从区间[0,1]上的均匀分布random_number(u)返回实数u(或此类数的数组)。[也就是说,它包括0但不包括1。]

为了在整数{n,n + 1,...,m-1,m}上具有离散的均匀分布,请将连续分布分成m + 1-n个相等大小的块,将每个块映射为一个整数。一种方法是:

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

如您所见,对于{0,1,2,3,4,5}的初始问题,这简化为

call random_number(u)
j = FLOOR(6*u)            ! n=0 and m=5
Run Code Online (Sandbox Code Playgroud)

对于其他情况,您的评论为{-1,0,1}

call random_number(u)
j = -1 + FLOOR(3*u)       ! n=-1 and m=1
Run Code Online (Sandbox Code Playgroud)

当然,非连续整数集还需要其他变换,并且应该注意数值问题。