lemon/bits/mingw32_rand.cc
author alpar
Wed, 05 Jul 2006 16:59:45 +0000
changeset 2120 a907fb95f1e0
permissions -rw-r--r--
As we agreed, Node/Edge::operator<() is required by the concept
     1 #ifdef WIN32
     2 
     3 #include <lemon/bits/mingw32_rand.h>
     4 
     5 
     6 static unsigned short _mingw_rand_state[10];
     7 
     8 void _mingw_rand_next_state(unsigned short xsubi[3]) {
     9   _mingw_rand_state[8] = _mingw_rand_state[9] = 0;
    10   _mingw_rand_state[7] =  _mingw_rand_state[6];
    11   for (int i = 0; i < 3; ++i) {
    12     unsigned long val = 0;
    13     for (int j = 0; i + j < 3; ++j) {
    14       val += (unsigned long)_mingw_rand_state[7 + i + j]
    15         + (unsigned long)xsubi[i] * (unsigned long)_mingw_rand_state[3 + j];
    16       _mingw_rand_state[7 + i + j] = val;
    17       val >>= 16;
    18     }
    19   }
    20   xsubi[0] = _mingw_rand_state[6];
    21   xsubi[1] = _mingw_rand_state[7];
    22   xsubi[2] = _mingw_rand_state[8];
    23 }
    24 
    25 long int lrand48(void) {
    26   return nrand48(_mingw_rand_state);
    27 }
    28 
    29 long int nrand48(unsigned short xsubi[3]) {
    30   _mingw_rand_next_state(xsubi);
    31   return ((long)(xsubi[2] & ( (1 << 15) - 1) ) << 16) | (long)xsubi[1];
    32 }
    33 
    34 double drand48(void) {
    35   return erand48(_mingw_rand_state);
    36 }
    37 
    38 double erand48(unsigned short xsubi[3]) {
    39   return (double)nrand48(xsubi) / (1 << 31);
    40 }
    41 
    42 
    43 long int mrand48(void) {
    44   return jrand48(_mingw_rand_state);
    45 }
    46 
    47 long int jrand48(unsigned short xsubi[3]) {
    48   _mingw_rand_next_state(xsubi);
    49   return ((long)xsubi[2] << 16) | (long)xsubi[1];
    50 }
    51 
    52 void srand48(long int seedval) {
    53   _mingw_rand_state[0] = 0x330E;
    54   _mingw_rand_state[1] = seedval & ( (1 << 16) - 1);
    55   _mingw_rand_state[2] = seedval >> 16;
    56   _mingw_rand_state[3] = 0xE66D;
    57   _mingw_rand_state[4] = 0xDEEC;
    58   _mingw_rand_state[5] = 0x0005;
    59   _mingw_rand_state[6] = 0x000B;
    60 }
    61 
    62 unsigned short *seed48(unsigned short seed16v[3]) {
    63   _mingw_rand_state[7] = _mingw_rand_state[0];
    64   _mingw_rand_state[8] = _mingw_rand_state[1];
    65   _mingw_rand_state[9] = _mingw_rand_state[2];
    66   _mingw_rand_state[0] = seed16v[0];
    67   _mingw_rand_state[1] = seed16v[1];
    68   _mingw_rand_state[2] = seed16v[2];
    69   return _mingw_rand_state + 7;
    70 }
    71 
    72 void lcong48(unsigned short param[7]) {
    73   _mingw_rand_state[0] = param[0];
    74   _mingw_rand_state[1] = param[1];
    75   _mingw_rand_state[2] = param[2];
    76   _mingw_rand_state[3] = param[3];
    77   _mingw_rand_state[4] = param[4];
    78   _mingw_rand_state[5] = param[5];
    79   _mingw_rand_state[6] = param[6];
    80 }
    81 
    82 
    83 #endif