Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran DO循环中的累加器_Fortran_Fortran90_Accumulator - Fatal编程技术网

Fortran DO循环中的累加器

Fortran DO循环中的累加器,fortran,fortran90,accumulator,Fortran,Fortran90,Accumulator,我的目标是创建10000个介于0和1之间的随机生成的数字,将它们组织成10个均匀分布在0和1之间的箱子,并计算每个箱子的频率。这是到目前为止我的代码 program listrand implicit none integer :: n,p integer :: a,b,c,d,e,f,g,h,i,j = 0 real :: xran !real, dimension(10,2) :: bin_and_freq -- list of bins and frequency do n = 1,10

我的目标是创建10000个介于0和1之间的随机生成的数字,将它们组织成10个均匀分布在0和1之间的箱子,并计算每个箱子的频率。这是到目前为止我的代码

program listrand
implicit none
integer :: n,p
integer :: a,b,c,d,e,f,g,h,i,j = 0
real :: xran
!real, dimension(10,2) :: bin_and_freq -- list of bins and frequency

do n = 1,10000
    call random_number(xran)
            if (xran <  0.1) then
                a = a + 1
            elseif (xran>0.1 .and. xran<0.2) then
                b = b + 1
            elseif (xran>0.2 .and. xran<0.3) then
                c = c+1
            elseif (xran>0.3 .and. xran<0.4) then
                d = d+1
            elseif (xran>0.4 .and. xran<0.5) then
                e = e + 1
            elseif (xran>0.5 .and. xran<0.6) then
                f = f+1
            elseif (xran>0.6 .and. xran<0.7) then
                g = g+1
            elseif (xran>0.7 .and. xran<0.8) then
                h=h+1
            elseif (xran>0.8 .and. xran<0.9) then
                i=i+1
            else
                j = j+1
            endif
enddo
print *, a,b,c,d,e,f,g,h,i,j
end program listrand
程序列表
隐式无
整数::n,p
整数::a,b,c,d,e,f,g,h,i,j=0
real::xran
!实,维(10,2)::bin_和_freq——bin和freq的列表
Don=110000
呼叫随机号码(xran)
如果(xran<0.1),则
a=a+1
elseif(xran>0.1.和.xran0.2.和.xran0.3.和.xran0.4.和.xran0.5.和.xran0.6.和.xran0.7.和.xran0.8.和.xran)

integer :: a,b,c,d,e,f,g,h,i,j = 0
您只是将
j
初始化为0,其他所有值都包含随机数。如果您添加

a = 0
b = 0
c = 0
d = 0
e = 0
f = 0
g = 0
h = 0
i = 0
j = 0
在循环之前,一切正常

至于如何简化它:

以下是我的程序版本:

program listrand
implicit none
integer, parameter :: nbins = 10
integer :: n, bin
integer :: bin_hits(nbins)   ! Number of bin hits
real :: xran
real :: bin_lower(nbins)     ! Lower edge of bins
                             ! bin_lower(1) == 0.0

bin_hits = 0

! Set up equidistant bins
bin_lower = [ (real(n-1) / nbins, n = 1, size(bin_lower)) ]

do n = 1,10000
    call random_number(xran)
    bin = count(bin_lower <= xran) 
    bin_hits(bin) = bin_hits(bin)+1
enddo
do n = 1, nbins-1
    print '(2(F6.2), I6)' bin_lower(n), bin_lower(n+1), bin_hits(n)
end do
print '(2(F6.2), I6)' bin_lower(nbins), 1.0, bin_hits(nbins)
end program listrand
程序列表
隐式无
整数,参数::nbins=10
整数::n,bin
整数::bin_命中数(nbins)!bin命中数
real::xran
real::bin_lower(nbins)!箱子的下边缘
!bin_lower(1)=0.0
bin_hits=0
!设置等距垃圾箱
bin_lower=[(实(n-1)/nbins,n=1,大小(bin_lower))]
Don=110000
呼叫随机号码(xran)
bin=计数(在您的长时间内,bin_较低)

integer :: a,b,c,d,e,f,g,h,i,j = 0
您只是将
j
初始化为0,其他所有值都包含随机数。如果您添加

a = 0
b = 0
c = 0
d = 0
e = 0
f = 0
g = 0
h = 0
i = 0
j = 0
在循环之前,一切正常

至于如何简化它:

以下是我的程序版本:

program listrand
implicit none
integer, parameter :: nbins = 10
integer :: n, bin
integer :: bin_hits(nbins)   ! Number of bin hits
real :: xran
real :: bin_lower(nbins)     ! Lower edge of bins
                             ! bin_lower(1) == 0.0

bin_hits = 0

! Set up equidistant bins
bin_lower = [ (real(n-1) / nbins, n = 1, size(bin_lower)) ]

do n = 1,10000
    call random_number(xran)
    bin = count(bin_lower <= xran) 
    bin_hits(bin) = bin_hits(bin)+1
enddo
do n = 1, nbins-1
    print '(2(F6.2), I6)' bin_lower(n), bin_lower(n+1), bin_hits(n)
end do
print '(2(F6.2), I6)' bin_lower(nbins), 1.0, bin_hits(nbins)
end program listrand
程序列表
隐式无
整数,参数::nbins=10
整数::n,bin
整数::bin_命中数(nbins)!bin命中数
real::xran
real::bin_lower(nbins)!箱子的下边缘
!bin_lower(1)=0.0
bin_hits=0
!设置等距垃圾箱
bin_lower=[(实(n-1)/nbins,n=1,大小(bin_lower))]
Don=110000
呼叫随机号码(xran)

bin=count(bin_lower如果执行速度是一个人的主要关注点,并且如果一个人愿意以空间换取时间,这可能会引起以下注意:

PROGRAM listrand

  IMPLICIT NONE

  INTEGER, PARAMETER :: nbins = 10
  INTEGER, PARAMETER :: nsamples = 10**4
  INTEGER :: bin_hits(0:nbins-1)
  REAL :: xran(nsamples)
  INTEGER :: binned_rn(nsamples), n

  bin_hits = 0

  CALL RANDOM_NUMBER(xran)
  binned_rn = INT(nbins*xran)
  DO n = 1, nsamples
    bin_hits(binned_rn(n)) = bin_hits(binned_rn(n)) +1
  END DO

  WRITE(*,*) bin_hits

END PROGRAM listrand

在有限数量的测试中,该版本的速度是@chw21版本的3-4倍。

如果执行速度是一个人的主要关注点,并且如果一个人愿意以空间换取时间,这可能会引起以下兴趣:

PROGRAM listrand

  IMPLICIT NONE

  INTEGER, PARAMETER :: nbins = 10
  INTEGER, PARAMETER :: nsamples = 10**4
  INTEGER :: bin_hits(0:nbins-1)
  REAL :: xran(nsamples)
  INTEGER :: binned_rn(nsamples), n

  bin_hits = 0

  CALL RANDOM_NUMBER(xran)
  binned_rn = INT(nbins*xran)
  DO n = 1, nsamples
    bin_hits(binned_rn(n)) = bin_hits(binned_rn(n)) +1
  END DO

  WRITE(*,*) bin_hits

END PROGRAM listrand

在有限数量的测试中,该版本的速度是@chw21版本的3-4倍。

谢谢,现在输出看起来更合理。在效率方面,有没有更好的方法来解决问题?@yellowblackandrectanglar:什么样的效率?通过提高“效率”你的目标是什么?我想他的意思是:更容易维护。更改代码中的存储箱数量会很麻烦。@CHW21是的。我四处查看,发现可能更容易的方法是在第一列为存储箱(0-9)的位置创建一个数组第二列是频率。然后我可以直接引用和增加数组元素,而不是引入变量a、b、c,……无论如何,感谢您的帮助,我将把这个标记为已解决。@chw21有没有办法垂直并排打印箱子和频率?我最后制作了两个数组a和b(每个都是维度10).a是频率列表,b=(/0,1,2,3…,9/)。我试着制作一个新的数组c,它是a和b的组合,但运气不好。谢谢,现在输出看起来更合理了。在效率方面,有没有更好的方法来解决这个问题?@yellowblackandrectangular:什么样的效率?通过提高“效率”你的目标是什么?我想他的意思是:更容易维护。更改代码中的存储箱数量会很麻烦。@CHW21是的。我四处查看,发现可能更容易的方法是在第一列为存储箱(0-9)的位置创建一个数组第二列是频率。然后我可以直接引用和增加数组元素,而不是引入变量a、b、c,……无论如何,感谢您的帮助,我将把这个标记为已解决。@chw21有没有办法垂直并排打印箱子和频率?我最后制作了两个数组a和b(每个都是维度10).a是频率列表,b=(/0,1,2,3…,9/)。我尝试制作一个新的数组c,它是a和b的组合,但运气不好。谢谢,但当我谈到效率时,我更关心的是代码行数,而不是计算速度。但出于好奇……每个程序运行需要多长时间?@yellowblackandrectangular这取决于编译器和machine。你为什么不自己编译并测试它。如果你使用的是基于Unix/Linux的系统,
time
命令会准确地告诉你程序运行了多长时间。谢谢,但当我谈到效率时,我更关心的是代码行的数量,而不是计算速度。但出于好奇……每行代码运行了多长时间程序运行时间?@yellowBlackandRectanglar,这取决于编译器和机器。为什么不自己编译并测试它。如果您使用的是基于Unix/Linux的系统,
time
命令会告诉您程序运行的确切时间。