home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / gnu / g__lib / mlcg.cc < prev    next >
Encoding:
C/C++ Source or Header  |  1993-07-23  |  1.9 KB  |  74 lines

  1. #include "MLCG.h"
  2. //
  3. //    SEED_TABLE_SIZE must be a power of 2
  4. //
  5.  
  6.  
  7. #define SEED_TABLE_SIZE 32
  8.  
  9. static long seedTable[SEED_TABLE_SIZE] = {
  10. 0xbdcc47e5, 0x54aea45d, 0xec0df859, 0xda84637b,
  11. 0xc8c6cb4f, 0x35574b01, 0x28260b7d, 0x0d07fdbf,
  12. 0x9faaeeb0, 0x613dd169, 0x5ce2d818, 0x85b9e706,
  13. 0xab2469db, 0xda02b0dc, 0x45c60d6e, 0xffe49d10,
  14. 0x7224fea3, 0xf9684fc9, 0xfc7ee074, 0x326ce92a,
  15. 0x366d13b5, 0x17aaa731, 0xeb83a675, 0x7781cb32,
  16. 0x4ec7c92d, 0x7f187521, 0x2cf346b4, 0xad13310f,
  17. 0xb89cff2b, 0x12164de1, 0xa865168d, 0x32b56cdf
  18. };
  19.  
  20. void MLCG::reset()
  21. {
  22.     //
  23.     //    Most people pick stupid seed numbers that don't have enough
  24.     //    bits. In this case, if they pick a small seed number, we
  25.     //    map that to a specific seed.
  26.     //
  27.     if (initialSeedOne < 0) {
  28.     initialSeedOne = (initialSeedOne + 2147483561);
  29.     initialSeedOne = (initialSeedOne < 0) ? -initialSeedOne : initialSeedOne;
  30.     }
  31.  
  32.     if (initialSeedTwo < 0) {
  33.     initialSeedTwo = (initialSeedTwo + 2147483561);
  34.     initialSeedTwo = (initialSeedTwo < 0) ? -initialSeedTwo : initialSeedTwo;
  35.     }
  36.  
  37.     if (initialSeedOne > -1 && initialSeedOne < SEED_TABLE_SIZE) {
  38.     seedOne = seedTable[initialSeedOne];
  39.     } else {
  40.     seedOne = initialSeedOne ^ seedTable[initialSeedOne & (SEED_TABLE_SIZE-1)];
  41.     }
  42.  
  43.     if (initialSeedTwo > -1 && initialSeedTwo < SEED_TABLE_SIZE) {
  44.     seedTwo = seedTable[initialSeedTwo];
  45.     } else {
  46.     seedTwo = initialSeedTwo ^ seedTable[initialSeedTwo & (SEED_TABLE_SIZE-1)];
  47.     }
  48.  
  49.     seedOne = (seedOne % 2147483561) + 1;
  50.     seedTwo = (seedTwo % 2147483397) + 1;
  51. }
  52.  
  53. unsigned long MLCG::asLong()
  54. {
  55.     long k = seedOne % 53668;
  56.  
  57.     seedOne = 40014 * (seedOne-k * 53668) - k * 12211;
  58.     if (seedOne < 0) {
  59.     seedOne += 2147483563;
  60.     }
  61.  
  62.     k = seedTwo % 52774;
  63.     seedTwo = 40692 * (seedTwo - k * 52774) - k * 3791;
  64.     if (seedTwo < 0) {
  65.     seedTwo += 2147483399;
  66.     }
  67.  
  68.     long z = seedOne - seedTwo;
  69.     if (z < 1) {
  70.     z += 2147483562;
  71.     }
  72.     return( (unsigned long) z);
  73. }
  74.