如何生成范围内的随机整数

时间:2014-05-01 12:26:00

标签: random fortran fortran90 fortran95

我写的一个程序要求我模拟基因的突变。如果选择基因的某个实例(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

1 个答案:

答案 0 :(得分:2)

对于集合{0,1,...,K-1},确实可以使用the other question的答案中给出的方法。可以通过在采样时拒绝J来处理J(0 <= J <= K-1)的复杂性。

然而,更好的方法是注意有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