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>