我有以下程序,在程序下面有一个输入数据文件,其中包含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
答案 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)
通用算法看起来像,
N
lines[N]
行
index[N] = {1, 2, ... N}
index
数组index[i]
,每个i
最多size
并输出line[i]
您必须自己使用您的语言进行转换