generators/netgen/random.c
author Alpar Juttner <alpar@cs.elte.hu>
Sun, 11 Dec 2011 18:43:33 +0100
changeset 13 0ab493e5250e
permissions -rw-r--r--
Add build id field to running time logs

Configurable by BENCHMARK_BUILD_ID cmake variable,
which defaults to the last component of the build directory.
     1 /*** This is a portable random number generator whose origins are
     2  *** unknown.  As far as can be told, this is public domain software.
     3 
     4 
     5 /*** portable random number generator */
     6 
     7 /*** Note that every variable used here must have at least 31 bits
     8  *** of precision, exclusive of sign.  Long integers should be enough.
     9  *** The generator is the congruential:  i = 7**5 * i mod (2^31-1).
    10  ***/
    11 
    12 #define MULTIPLIER 16807
    13 #define MODULUS    2147483647
    14 
    15 static long saved_seed;
    16 
    17 
    18 /*** set_random - initialize constants and seed */
    19 
    20 void set_random(seed)
    21 long seed;
    22 {
    23   saved_seed = seed;
    24 }
    25 
    26 
    27 /*** ng_random - generate a random integer in the interval [a,b] (b >= a >= 0) */
    28 
    29 long ng_random(a, b)
    30 long a, b;
    31 {
    32   register long hi, lo;
    33 
    34   hi = MULTIPLIER * (saved_seed >> 16);
    35   lo = MULTIPLIER * (saved_seed & 0xffff);
    36   hi += (lo>>16);
    37   lo &= 0xffff;
    38   lo += (hi>>15);
    39   hi &= 0x7fff;
    40   lo -= MODULUS;
    41   if ((saved_seed = (hi<<16) + lo) < 0)
    42     saved_seed += MODULUS;
    43 
    44   if (b <= a)
    45     return b;
    46   return a + saved_seed % (b - a + 1);
    47 }