我是一名初学者,尝试使用 fortran 77 进行一些工程实验。我正在使用 Force 2.0 编译器和编辑器。我有以下查询:
- 如何在指定范围内生成随机数,例如,如果我需要在 3.0 和 10.0 之间生成单个随机数,我该怎么做?
- 如何使用文本文件中的数据在程序的计算中调用。例如,我有温度、压力和湿度值(一天的每小时值,因此每个文本文件中总共有 24 个值)。
- 我是否还需要在程序中定义文本文件中有多少个值?
我是一名初学者,尝试使用 fortran 77 进行一些工程实验。我正在使用 Force 2.0 编译器和编辑器。我有以下查询:
Knuth 已将C 和 FORTRAN中的伪随机数生成器的源代码发布到公共领域,该生成器在计算机编程的艺术第 3.6 节中描述。
第二个问题:
例如,如果您的文件如下所示:
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 中有一些内在的功能。我去看看,明天汇报。至于第三个问题,我不确定你的意思(你不知道文件中有多少行数据?或?)
您需要查看编译器手册以了解特定的随机数生成器函数,但它可能会生成 0 到 1 之间的随机数。这很容易处理 - 您只需将间隔缩放为适当的宽度,然后将其转换为匹配正确的起点:即映射到r
in ,use ,其中是您从随机数生成器获得的值,并且是您想要的范围内的随机值。[0, 1]
s
[a, b]
s = r*(b-a) + a
r
s
Idigas 的回答很好地涵盖了您的第二个问题 - 使用格式化输入读取数据,然后像使用任何其他变量一样使用它们。
对于您的第三个问题,您需要定义文本文件中有多少行,只有当您想对所有这些行执行某些操作时 - 如果您正在查看该行,处理它,然后继续,您可以在不知道行数的情况下过活。但是,如果您希望将所有值存储在文件中(例如,具有温度、湿度和压力数组,以便计算蒸汽压统计数据),则需要以某种方式设置存储。通常在 FORTRAN 77 中,这是通过预先分配一个比您认为需要的更大的数组来完成的,但这很快就会成为问题。有没有机会切换到 Fortran 90?更新版本在处理标准化动态内存分配方面有更好的设施,更不用说许多其他优点了。我会如果可能的话,强烈建议使用 F90 - 你会让你的生活更轻松。
根据您正在执行的处理类型,另一种选择是研究仅使用单次遍历数据的算法,因此您不需要存储所有内容来计算诸如平均值和标准偏差之类的东西。
该子例程在 fortran 77 中生成一个介于 0 和 ifin 之间的随机数,其中 i 是种子;一些很棒的数字,例如 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
您可以修改以获取一定的范围。