|
|
1.1 ! root 1: /* fake version of ldiv() */ ! 2: typedef struct ldiv_t { long quot, rem; } ldiv_t; ! 3: ldiv_t ldiv(numer, denom) long numer, denom; ! 4: { ! 5: ldiv_t l; ! 6: l.quot = numer / denom; ! 7: l.rem = numer % denom; ! 8: return l; ! 9: } ! 10: /*-----------------------------------------------------------------*/ ! 11: /* Efficient and Portable Combined Random Number Generators */ ! 12: /* Pierre L'Ecuyer */ ! 13: /* CACM V. 31 N. 6 pp. 742-749, 774, June 1988 */ ! 14: ! 15: /* This random number generator has a period of 2e18. */ ! 16: /* It can be computed with 2 divides and 4 multiplies */ ! 17: /* where divides return 16 bit quotient and remainder */ ! 18: /* of a 32 bit number divided by a 16 bit number, and */ ! 19: /* mulitplies return a 32 bit product of two 16 bit */ ! 20: /* factors. The ANSI portable implementation is less than */ ! 21: /* optimal, since it must be implemented using long arithmetic, */ ! 22: /* but at least the algorithm can be specified. */ ! 23: ! 24: static long s1 = 1; ! 25: static long s2 = 1; ! 26: ! 27: void srandl(seed1, seed2) unsigned long seed1, seed2; ! 28: { ! 29: s1 = seed1 % 2147483562L + 1; ! 30: s2 = seed2 % 2147483398L + 1; ! 31: } ! 32: ! 33: /* uniform distribution in [1 .. 2147483562] */ ! 34: long randl() ! 35: { ! 36: ldiv_t l; ! 37: register long t; ! 38: ! 39: l = ldiv(s1, 53668L); ! 40: if ((s1 = 40014L * l.rem - 12211 * l.quot) < 0) ! 41: s1 += 2147483563L; ! 42: l = ldiv(s2, 52774L); ! 43: if ((s2 = 40692L * l.rem - 3791 * l.quot) < 0) ! 44: s2 += 2147483399L; ! 45: if ((t = s1 - s2) < 1) ! 46: t += 2147483562L; ! 47: return t-1; ! 48: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.