Annotation of embedaddon/quagga/isisd/topology/random.c, revision 1.1.1.1
1.1 misho 1: /*********************************************************************/
2: /* */
3: /* current processor time in seconds */
4: /* difference between two calls is processor time spent by your code */
5: /* needs: <sys/types.h>, <sys/times.h> */
6: /* depends on compiler and OS */
7: /* */
8: /*********************************************************************/
9:
10: #include <sys/types.h>
11: #include <sys/times.h>
12:
13: /*
14: * Prototypes.
15: */
16: unsigned long timer(void);
17: void init_rand(long);
18: double rand01(void);
19: double randg01(void);
20: long nrand(long);
21: void free_arc(void *);
22:
23: unsigned long timer ()
24: { struct tms hold;
25:
26: times(&hold);
27: return (unsigned long) ((float) (hold.tms_utime) / 60.0);
28: }
29:
30:
31: /*********************************************************************/
32: /* */
33: /* Family of random number generators */
34: /* */
35: /* Initialisation: */
36: /* void init_rand ( seed ); */
37: /* long seed - any positive number */
38: /* if seed<=0 init_rand takes time */
39: /* from timer instead of seed */
40: /* */
41: /* Whole number uniformly distributed on [0,n): */
42: /* long nrand (n); */
43: /* long n */
44: /* */
45: /* Real number uniformly distributed on [0,1] */
46: /* double rand01(); */
47: /* */
48: /* Real number with Gauss(0,1) disitribution: */
49: /* double randg01(); */
50: /* */
51: /* Algorithm: */
52: /* x(n+1) = (x(n) * 5^13) mod 2^31 */
53: /* */
54: /*********************************************************************/
55:
56: unsigned long internal_seed;
57:
58: void init_rand ( init_seed )
59:
60: long init_seed;
61:
62: { internal_seed = ( init_seed > 0 )
63: ? (unsigned long) init_seed
64: : (unsigned long) timer();
65:
66:
67: /* only odd numbers are acceptable */
68: if ( internal_seed % 2 == 0 ) internal_seed --;
69: }
70:
71: /*********************************************************************/
72: /* */
73: /* Internal function irand may depend on OS and compiler */
74: /* */
75: /* irand assumption: */
76: /* unsigned long i,j; */
77: /* if i*j > max(unsigned long) */
78: /* 1. No overflow interruption */
79: /* 2. i*j = i*j mod max(unsigned long) */
80: /* */
81: /* This assumption is true for a lot of computers. */
82: /* If your computer fails: */
83: /* rename: irand <---> xrand */
84: /* */
85: /*********************************************************************/
86:
87: #define A 1220703125
88: #define B 2147483647
89: #define BF 2147483647.
90:
91: static long irand ()
92:
93: { internal_seed = ( internal_seed * A ) & B;
94: return (long) internal_seed ;
95: }
96:
97: #if 0 /* Not used. */
98: /*********************************************************************/
99: /* */
100: /* computer independent variant of irand */
101: /* */
102: /*********************************************************************/
103:
104:
105: #define T15 32768
106: #define T16 65536
107: #define A1 37252
108: #define A2 29589
109:
110: static long xrand()
111:
112: { unsigned long is1, is2;
113:
114: is1 = internal_seed / T15;
115: is2 = internal_seed % T15;
116:
117: internal_seed = ( (((is2 * A1) + (is1 * A2))% T16 )* T15 + (is2 * A2) ) & B;
118: return (long) ( internal_seed ) ;
119: }
120: #endif
121:
122: /*********************************************************************/
123:
124:
125: double rand01()
126:
127: { return (double) (irand() / BF) ;
128: }
129:
130: /*********************************************************************/
131:
132: #define NK 12
133:
134: double randg01()
135:
136: { int i;
137: double sum = 0;
138:
139: for ( i = 0; i < NK; i++ ) sum += rand01();
140: return sum - 6.;
141:
142: /* if NK != 12 then you must return (12/NK)*sum - (NK/2) */
143: }
144:
145: #undef NK
146:
147:
148: /*********************************************************************/
149:
150: long nrand ( n )
151:
152: long n;
153:
154: { return (long) ( rand01() * (double) n );
155: }
156:
157: /*********************************************************************/
158:
159: #undef A
160: #undef A1
161: #undef A2
162: #undef B
163: #undef BF
164: #undef T15
165: #undef T16
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>