如何在[0,5]范围内的fortran 90中生成整数随机数?
Posted
技术标签:
【中文标题】如何在[0,5]范围内的fortran 90中生成整数随机数?【英文标题】:how to generate integer random number in fortran 90 in the range [0,5]? 【发布时间】:2014-05-28 05:49:54 【问题描述】:我是 Fortran 编程的新手。 谁能帮我解决一下。 我遇到了生成整数随机数的问题 在 fortran 随机数的 [0,5] 范围内使用 random_seed 和 rand
【问题讨论】:
rand
是一个 GNU 扩展。 Fortran 95 组合是random_seed
和random_number
。
您可以接受正好 5 的结果吗?还是您的意思是要求范围 [0,5) ?以下建议不会为您提供准确的端点值(可能通过舍入除外。)
@SteveLionel 我不太清楚你的意思......你能详细说明一下吗?
您使用了术语“[0,5]”。这是“区间表示法”,意味着该值可以是从 0 到 5 之间的任何值。重新考虑,这可能就是您想要的。 francescalus 在下面的回答更详细地解释了。
【参考方案1】:
为了支持 Alexander Vogt 的 answer,我将进行概括。
内在 random_number(u)
从区间 [0,1) 上的均匀分布返回实数 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
如您所见,对于 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
当然,对于不连续的整数集合,需要进行其他的转换,并且要注意数值问题。
【讨论】:
为了避免由于real
尾数中的位数有限(IEEE 754 双精度为 53,单精度为 24)而导致的偏差,您可能需要多次调用 random_number
,例如,见how _randbelow(n)
is implemented via random()
in Python
(0,5)
之间可以生成随机实数吗? @francescalus【参考方案2】:
怎么样:
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
【讨论】:
然后使用real :: ...
和6.
。但是,请帮自己一个忙,改用明确的定义!
i = floor( r*3. ) - 1
我不明白为什么不 - 你只是在改变界限。
你当然。还有一个问题是浮点错误 M6101:MATH。为什么会这样?
我发现当我将某个整数 580 与数字 1.97e-7 相除时,除法会给出一个负整数。为什么会这样?以上是关于如何在[0,5]范围内的fortran 90中生成整数随机数?的主要内容,如果未能解决你的问题,请参考以下文章