如何在[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_seedrandom_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中生成整数随机数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 HSQLDB 中生成一个范围内的数字行列表?

如何在 Java 中生成特定范围内的随机整数?

如何在 Java 中生成特定范围内的随机整数?

在MATLAB中生成一定范围内的随机数

在python中生成给定范围内的所有日期

在熊猫中生成给定范围内的随机日期