lemon/bits/mingw32_rand.cc
changeset 2078 123f08422c14
equal deleted inserted replaced
-1:000000000000 0:bb6b92e1a669
       
     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