读取和打印随机数

时间:2015-12-29 08:21:34

标签: random fortran fortran90

我有以下程序,在程序下面有一个输入数据文件,其中包含10行不同的数据。我想要不按顺序随机读取这些数据,例如,它可能会读取第3行然后第5行,而不是数字1 2 3 4 ...然后这些数字我想随机打印。

 program rand
  implicit none
  integer::i, ok
  real(kind=8) , allocatable , dimension(:):: s
  integer, parameter:: nstep = 1, natom = 10
  integer:: seed, rand


  open(unit=2,file="fort.2",status="old",action="read")


  allocate(s(natom),stat=ok)
  if(ok/=0)then
  print*,"problem allocating position array"
  end if

  do i=1,natom
  read(2,*)s(i)
  print*,i=(rand(seed))
  end do
  end program rand

输入文件:

   1.004624
   1.008447
   1.028897
   1.001287
  0.9994195
   1.036111
  0.9829285
   1.029622
   1.005867
  0.9372157

2 个答案:

答案 0 :(得分:2)

正如@IanBush在评论中所建议的,以及@Sazzad在他的回答中所建议的,一个合理的方法是将整个文件读入一个数组,因为你的程序已经在做了。然而,在我看来,简单的抽奖并不会导致随机打印。这只是一个新订单。这就是我提出这个解决方案的原因。 随机意味着如果打印数量有限,可以多次打印相同的数字而根本不打印其他数字。正如我可以看到你的问题是如何随机选择。由于您付出了一些努力,这里是您程序的修改版本

program rand
    implicit none
    integer::i, ok, idx
    real(kind=8) , allocatable , dimension(:):: s
    integer, parameter:: nstep = 1, natom = 10
    integer:: seed!, rand
    real(kind = 8) :: randNum
    !
    !
    open(unit=2,file="fort.2",status="old",action="read")
    !
    !
    allocate(s(natom),stat=ok)
    if(ok/=0)then
        print*,"problem allocating position array"
    end if
    !
    do i=1,natom
        read(2,*)s(i)
        !print*,i=(rand(seed))
    end do
    !
    CALL random_seed() ! Initialize a pseudo-random number sequence
    ! to the default state. For serious program, do not use the default
    ! use for example the program on the website of gnu fortran
    ! https://gcc.gnu.org/onlinedocs/gfortran/RANDOM_005fSEED.html
    !
    do i=1,natom !you can and should change natom here to something else
        CALL random_number(randNum)
        idx = int(randNum*natom) + 1
        print*,'element at ',idx,': ', s(idx)
    end do
end program rand

这种区别在于打印在原始程序中被注释,并且有一个新的循环可以随机打印。您将看到一些数字将被打印多次。要为每个数字提供打印机会,您应该在打印循环中设置大量迭代。 在这个答案中,我使用默认种子作为随机数,这不是一个好主意。在gnu fortran(link)的网站上,您可以找到初始化随机种子的好方法。如果重复性不是问题,那么这是一个很好的编程习惯。

答案 1 :(得分:1)

通用算法看起来像,

  1. N
  2. 中的文件中读取所有或lines[N]
  3. 创建数组index[N] = {1, 2, ... N}
  4. 使用简单的随机算法随机播放index数组
  5. 遍历index[i],每个i最多size并输出line[i]
  6. 您必须自己使用您的语言进行转换