random.f
2.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
function random (t, n)
c
c this random number generator is portable amoung a wide variety of
c computers. it generates a random number between 0.0 and 1.0 accord-
c ing to the algorithm presented by bays and durham (toms, 2, 59,
c 1976). the motivation for using this scheme, which resembles the
c maclaren-marsaglia method, is to greatly increase the period of the
c random sequence. if the period of the basic generator (rand) is p,
c then the expected mean period of the sequence generated by random is
c given by new mean p = sqrt (pi*factorial(n)/(8*p)),
c where factorial(n) must be much greater than p in this asymptotic
c formula. generally, n should be 16 to maybe 32.
c
c input argument --
c n iabs(n) is the number of random numbers in an auxiliary table.
c note though that iabs(n)+1 is the number of items in array t.
c if n is positive and differs from its value in the previous
c invocation, then the table is initialized for the new value of
c n. if n is negative, iabs(n) is the number of items in an
c auxiliary table, but the tables are now assumed already to
c be initialized. this option enables the user to save the
c table t at the end of a long computer run and to restart with
c the same sequence. normally, random would be called at most
c once with negative n. subsequent invocations would have n
c positive and of the correct magnitude.
c
c input and output argument --
c t an array of iabs(n)+1 random numbers from a previous invocation
c of random. whenever n is positive and differs from the old
c n, the table is initialized. the first iabs(n) numbers are the
c table discussed in the reference, and the n+1 -st value is y.
c this array may be saved in order to restart a sequence.
c
c output value --
c random a random number between 0.0 and 1.0.
c
dimension t(1)
external rand
data nold, floatn / -1, -1.0 /
c
if (n.eq.nold) go to 20
c
nold = iabs(n)
floatn = nold
if (n.lt.0) dummy = rand (t(nold+1))
if (n.lt.0) go to 20
c
do 10 i=1,nold
t(i) = rand (0.)
10 continue
t(nold+1) = rand (0.)
c
20 j = t(nold+1)*floatn + 1.
t(nold+1) = t(j)
random = t(j)
t(j) = rand (0.)
c
return
end