Blame view
fvn_fnlib/random.f
2.33 KB
38581db0c git-svn-id: https... |
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 |