Random 集中在一定范围内的随机数

Random 集中在一定范围内的随机数,random,fortran,gfortran,Random,Fortran,Gfortran,我编写了Fortran代码来生成一系列随机数。在这段代码中,我可以设置随机数窗口(最小和最大随机数)以及该窗口中随机数的百分比(随机数)。我希望生成的随机数总是彼此不同 我可以使用gfortran编译器成功地编译它;然而,我发现了一个问题。例如,当我分别输入1和81作为最小值和最大值,0.07作为百分比时,代码总是给我七个不同的随机数,它们总是小于10,无论我运行了多少次。我所期望的是,代码应该给我七个不同的随机数,它们分布在1~81范围内,而不是只集中在1~10范围内。我不知道为什么代码给我的

我编写了Fortran代码来生成一系列随机数。在这段代码中,我可以设置随机数窗口(最小和最大随机数)以及该窗口中随机数的百分比(随机数)。我希望生成的随机数总是彼此不同

我可以使用gfortran编译器成功地编译它;然而,我发现了一个问题。例如,当我分别输入1和81作为最小值和最大值,0.07作为百分比时,代码总是给我七个不同的随机数,它们总是小于10,无论我运行了多少次。我所期望的是,代码应该给我七个不同的随机数,它们分布在1~81范围内,而不是只集中在1~10范围内。我不知道为什么代码给我的随机数只集中在一定范围内。我把代码贴在下面

你能就我的问题给我一些建议吗?事先非常感谢

   PROGRAM RANDOM_POSITION
   IMPLICIT NONE
   REAL percent, val
   INTEGER maxi, mini, num, i, l
   INTEGER, DIMENSION(1), ALLOCATABLE :: position(:)
   PRINT *,'Range for the impurity position(maximum and minimum value):'
   PRINT *,'Minimum value:'
   READ (UNIT=*, FMT=*) mini
   PRINT *,'Maximum value:'
   READ (UNIT=*, FMT=*) maxi
   PRINT 11,'Percentage of impurity='
   11 FORMAT(A23,$)
   READ (UNIT=*, FMT=*) percent
   num = (maxi-mini) * percent
   IF ((maxi-mini) * percent-num  .NE. 0.0) THEN
      num = num + 1
   END IF
   PRINT *, num
   ALLOCATE (position(num))
   CALL RANDOM_SEED()
   DO i=1, num ,1
      CALL RANDOM_NUMBER(val)
      position(i) = NINT(mini + val * num)
      CALL JUDGEMENT(position, i, l)
      l = 0
      DO WHILE (l .EQ. 0)
               CALL RANDOM_NUMBER(val)
               position(i) = NINT(mini + val * num)
               CALL JUDGEMENT(position, i, l)
      END DO      
      PRINT *, position(i)
   END DO
   DEALLOCATE(position)
   STOP
   END PROGRAM RANDOM_POSITION
   SUBROUTINE JUDGEMENT(arr, j, l)
   IMPLICIT NONE
   INTEGER j, k, l
   INTEGER, DIMENSION(1) :: arr(j)
   l = 1
   DO k=1, j-1, 1
      IF (arr(k) .EQ. arr(j)) THEN
         l = 0
         EXIT
      ELSE
         l = 1
      END IF
   END DO
   RETURN
   END SUBROUTINE JUDGEMENT

我没有对你的问题考虑太多,但是你有
l=0
,后面是一个带有
l.eq.0
条件的循环。在该循环中,
l
的值似乎永远不会改变。19正是
num=(maxi mini)*percent
的结果。你希望得到什么?亲爱的,非常感谢你的回答。我终于找到了毛病。我改变了子程序中的参数l值,但在调用子程序时,我并没有在主代码和子程序之间传递它。然后l值总是相同的,循环只是继续,从不跳出。我已经把它整理好了。非常感谢您的帮助。您的代码仍然有错误。例如,当滚动的数字已经在数组中时,您不会再次滚动,只需再次检查。这可能导致无限循环。另外,如果你想要介于
mini
maxi
之间的数字,你应该使用
x=mini+val*(maxi-mini+1)
亲爱的大家,我修改了我的FORTRAN代码并将其粘贴到我的问题中;然而,当我运行它时,我发现了另一个问题。我更新我的问题。请你看一看,并给我一些如何整理的建议好吗?事先非常感谢。