|
|
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.