【问题标题】:How to generate a random integer in a range如何生成范围内的随机整数
【发布时间】:2014-05-01 12:26:00
【问题描述】:

我正在编写的程序要求我模拟基因的突变。如果选择基因的某个实例 (J) 进行突变,它必须随机成为替代基因的预定义子集之一。这些离散基​​因用 0 到 K-1 范围内的整数标记,其中 K 等于等位基因的总数。

所以基本上,我需要帮助编写代码以随机选择 0 到 K-1 范围内不等于 J 的整数。非常感谢任何帮助!

另一个编辑:感谢到目前为止的所有帮助,我想出了以下内容,它忽略了我不能等于 J 的要求。但是,我遇到的另一个问题是该过程必须重复多次次,并且由于每次使用相同的种子 i 的值始终相同。我应该如何确保种子价值不会在每一代人中保持不变?再次感谢任何帮助!

program randtest

implicit none

  real*4        :: u(5)
  integer       :: i(5)
  integer       :: k = 4
  integer, dimension (1) :: seed = (/2817/)

  call random_seed(put=seed) 

  call random_number(u)

i = floor((k+1)*u) 

 print *, i

 end program randtest

【问题讨论】:

标签: random fortran fortran90 fortran95


【解决方案1】:

对于集合 {0, 1, ..., K-1},确实可以使用the other question 的答案中给出的方法。 J(0

但是,更好的方法是注意有 K-2 个有效整数:{0, 1, ..., J-1, J+1, ..., K-1}。因此,使用该方法在 {0, 1, ..., K-2} 上生成一个整数,然后将任何会受到拒绝 J 影响的东西上移。

call random_number(u)
i = FLOOR((K-1)*u)  !this would be how I would define the range
if (i.ge.J) i=i+1

【讨论】:

  • 谢谢,到目前为止我已经想出了以下内容。program randtest implicit none real*4 :: u(5) integer :: i(5) integer :: k = 4 integer, dimension (1) :: seed = (/2817/) call random_seed(put=seed) call random_number(u) i = floor((k+1)*u) print *, i end program randtest
猜你喜欢
  • 1970-01-01
  • 2010-12-24
  • 2014-08-11
  • 2010-09-22
相关资源
最近更新 更多