summaryrefslogtreecommitdiff
path: root/Utilib/src/RANDF.f
diff options
context:
space:
mode:
Diffstat (limited to 'Utilib/src/RANDF.f')
-rw-r--r--Utilib/src/RANDF.f65
1 files changed, 65 insertions, 0 deletions
diff --git a/Utilib/src/RANDF.f b/Utilib/src/RANDF.f
new file mode 100644
index 0000000..9b9e6de
--- /dev/null
+++ b/Utilib/src/RANDF.f
@@ -0,0 +1,65 @@
+*DECK RANDF
+ SUBROUTINE RANDF(ISEED,IFIRST,RAND)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* This subroutine returns a pseudo-random number for each invocation.
+* It is a FORTRAN 77 adaptation of the "Integer Version 2" minimal
+* standard number generator whose Pascal code appears in reference.
+*
+*Copyright:
+* Copyright (C) 2008 Ecole Polytechnique de Montreal
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation; either
+* version 2.1 of the License, or (at your option) any later version
+*
+*Author(s): R. Chambon
+*
+*Parameters: input
+* ISEED the seed for the generation of random numbers.
+* IFIRST set to 1 to indicate that the seed is being generated.
+*
+*Parameters: ouput
+* IFIRST set to 1 to indicate that the seed is being generated.
+* RAND random number between 0 and 1.
+*
+*Reference:
+* Park, Steven K. and Miller, Keith W., "Random Number Generators:
+* Good Ones are Hard to Find", Communications of the ACM, October 1988.
+*
+*-----------------------------------------------------------------------
+*
+ IMPLICIT NONE
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ INTEGER ISEED,IFIRST
+ REAL RAND
+ DOUBLE PRECISION D1,D2
+*----
+* LOCAL VARIABLES
+*----
+ INTEGER MPLIER,MODLUS,MOBYMP,MOMDMP
+ PARAMETER (MPLIER=16807,MODLUS=2147483647,MOBYMP=127773,
+ + MOMDMP=2836)
+ INTEGER HVLUE, LVLUE, TESTV, NEXTN
+*
+ IF (IFIRST .EQ. 0) IFIRST = 1
+ NEXTN = ISEED
+*
+ HVLUE = NEXTN / MOBYMP
+ LVLUE = MOD(NEXTN, MOBYMP)
+ TESTV = MPLIER*LVLUE - MOMDMP*HVLUE
+ IF (TESTV .GT. 0) THEN
+ NEXTN = TESTV
+ ELSE
+ NEXTN = TESTV + MODLUS
+ ENDIF
+ D1=DBLE(NEXTN)
+ D2=DBLE(MODLUS)
+ RAND=REAL(D1/D2)
+ ISEED= NEXTN
+ RETURN
+ END