关于什么:
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)
为了支持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)
当然,非连续整数集还需要其他变换,并且应该注意数值问题。
归档时间: |
|
查看次数: |
26724 次 |
最近记录: |