在Fortran 77中生成给定范围内的随机数

时间:2009-05-22 02:51:35

标签: random fortran text-files fortran77

我是初学者,尝试使用fortran 77进行一些工程实验。我使用的是Force 2.0编译器和编辑器。我有以下疑问:

  1. 如何在指定范围之间生成随机数,例如如果我需要生成3.0到10.0之间的单个随机数,我该怎么做?
  2. 如何在程序中使用文本文件中的数据进行计算。例如,我有温度,压力和湿度值(一天的每小时值,因此每个文本文件中总共24个值)。
  3. 我是否还需要在程序中定义文本文件中有多少个值?

5 个答案:

答案 0 :(得分:3)

Fortran 77的标准没有指定随机数生成器,但您可以使用为此目的自由提供的任何无数源;例如,http://www.cisl.ucar.edu/zine/96/spring/articles/3.random-6.html有一个好的,可用的f77 SRAND子程序,可供您复制和粘贴。

答案 1 :(得分:3)

Knuth对于计算机编程艺术的第3.6节中描述的伪随机数生成器有released into the public domain sources in both C and FORTRAN

答案 2 :(得分:1)

第二个问题:

例如,如果您的文件如下所示:

hour temperature pressure humidity
00   15          101325   60
01   15          101325   60
... 24 of them, for each hour one

这个简单的程序会读它:

implicit none
integer hour, temp, hum
real p
character(80) junkline
open(unit=1, file='name_of_file.dat', status='old')
rewind(1)
read(1,*)junkline
do 10 i=1,24
read(1,*)hour,temp,p,hum
 C   do something here ...
 10  end
close(1)
end

(缩进有点搞砸,但我不知道如何在这个奇怪的环境中正确设置它)

我的建议:阅读数据类型(INTEGER,REAL,CHARACTER),数组(DIMENSION),输入/输出(READ,WRITE,OPEN,CLOSE,REWIND)和循环(DO,FOR),以及''我马上就会做有用的东西。

我从未对随机数做任何事情,所以我无法帮助你,但我认为fortran中有一些内在的功能。我会检查出来,并明天报告。关于第3个问题,我不确定你的意思(你不知道你在文件中会有多少行数据?或者?)

答案 3 :(得分:0)

您需要检查编译器手册中的特定随机数生成器函数,但有可能生成0到1之间的随机数。这很容易处理 - 您只需将间隔缩放到适当的宽度,然后移动它以匹配正确的起点:即将r中的[0, 1]映射到s中的[a, b],使用s = r*(b-a) + a,其中r是您从随机数生成器获得的值s是您想要的范围内的随机值。

Idigas's answer很好地涵盖了你的第二个问题 - 使用格式化输入读取数据,然后像使用任何其他变量一样使用它们。

对于你的第三个问题,你需要定义文本文件中有多少行,只要你想对所有这些行做一些事情 - 如果你正在寻找读取行,处理它,然后继续,你可以在不知道提前行数的情况下完成。但是,如果您要将所有值存储在文件中(例如,具有温度,湿度和压力阵列,以便您可以计算蒸汽压力统计数据),则需要以某种方式设置存储。通常在FORTRAN 77中,这是通过预先分配大于您认为需要的大小的数组来完成的,但这很快就会成为问题。有没有机会切换到Fortran 90?更新版本具有更好的处理标准化动态内存分配的工具,更不用说许多其他优点。我会强烈推荐使用F90,如果可能的话 - 你会让你的生活更轻松。

根据您正在进行的处理类型,另一个选项是调查仅使用单次传递数据的算法,因此您不需要存储所有内容来计算诸如均值和标准偏差之类的内容,例如

答案 4 :(得分:0)

此子例程在fortran 77中生成一个介于0和ifin之间的随机数 我是种子一些很大的数字,例如746397923

    subroutine rnd001(xi,i,ifin)
    integer*4 i,ifin
    real*8 xi
    i=i*54891
    xi=i*2.328306e-10+0.5D00
    xi=xi*ifin
    return
    end

您可以进行修改,以适应特定范围。