Annotation of embedaddon/quagga/isisd/topology/random.c, revision 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>