70 lines
2.0 KiB
Fortran
70 lines
2.0 KiB
Fortran
PROGRAM LOOPBREAK
|
|
INTEGER I, RNDINT
|
|
|
|
C It doesn't matter what number you put here.
|
|
CALL SDRAND(123)
|
|
|
|
C Because FORTRAN 77 semantically lacks many loop structures, we
|
|
C have to use GOTO statements to do the same thing.
|
|
10 CONTINUE
|
|
C Print a random number.
|
|
I = RNDINT(0, 19)
|
|
WRITE (*,*) I
|
|
|
|
C If the random number is ten, break (i.e. skip to after the end
|
|
C of the "loop").
|
|
IF (I .EQ. 10) GOTO 20
|
|
|
|
C Otherwise, print a second random number.
|
|
I = RNDINT(0, 19)
|
|
WRITE (*,*) I
|
|
|
|
C This is the end of our "loop," meaning we jump back to the
|
|
C beginning again.
|
|
GOTO 10
|
|
|
|
20 CONTINUE
|
|
|
|
STOP
|
|
END
|
|
|
|
C FORTRAN 77 does not come with a random number generator, but it
|
|
C is easy enough to type "fortran 77 random number generator" into your
|
|
C preferred search engine and to copy and paste what you find. The
|
|
C following code is a slightly-modified version of:
|
|
C
|
|
C http://www.tat.physik.uni-tuebingen.de/
|
|
C ~kley/lehre/ftn77/tutorial/subprograms.html
|
|
SUBROUTINE SDRAND (IRSEED)
|
|
COMMON /SEED/ UTSEED, IRFRST
|
|
UTSEED = IRSEED
|
|
IRFRST = 0
|
|
RETURN
|
|
END
|
|
INTEGER FUNCTION RNDINT (IFROM, ITO)
|
|
INTEGER IFROM, ITO
|
|
PARAMETER (MPLIER=16807, MODLUS=2147483647, &
|
|
& MOBYMP=127773, MOMDMP=2836)
|
|
COMMON /SEED/ UTSEED, IRFRST
|
|
INTEGER HVLUE, LVLUE, TESTV, NEXTN
|
|
SAVE NEXTN
|
|
IF (IRFRST .EQ. 0) THEN
|
|
NEXTN = UTSEED
|
|
IRFRST = 1
|
|
ENDIF
|
|
HVLUE = NEXTN / MOBYMP
|
|
LVLUE = MOD(NEXTN, MOBYMP)
|
|
TESTV = MPLIER*LVLUE - MOMDMP*HVLUE
|
|
IF (TESTV .GT. 0) THEN
|
|
NEXTN = TESTV
|
|
ELSE
|
|
NEXTN = TESTV + MODLUS
|
|
ENDIF
|
|
IF (NEXTN .GE. 0) THEN
|
|
RNDINT = MOD(MOD(NEXTN, MODLUS), ITO - IFROM + 1) + IFROM
|
|
ELSE
|
|
RNDINT = MOD(MOD(NEXTN, MODLUS), ITO - IFROM + 1) + ITO + 1
|
|
ENDIF
|
|
RETURN
|
|
END
|