home *** CD-ROM | disk | FTP | other *** search
/ Boldly Go Collection / version40.iso / TS / 17A / DRWIN101.ZIP / R250.CPP < prev    next >
C/C++ Source or Header  |  1991-05-13  |  2KB  |  63 lines

  1. #include <stdlib.h>
  2. #include <time.h>
  3.  
  4. #include "r250.hpp"
  5.  
  6. #define LOWORD(x)      (*((WORD*)&(x)))
  7. #define HIWORD(x)      (*(((WORD*)&(x))+1))
  8.  
  9.  
  10. R250::R250(void)
  11. {
  12.   int i;
  13.   DWORD k=1;
  14.  
  15.   randomize();
  16.   for (i=0;i<SIZE;i++) {               //put in initial random numbers
  17.     HIWORD(r[i])=(rand()<<1) ^ rand(); //..initialize MSW, rand onl
  18.     LOWORD(r[i])=(rand()<<1) ^ rand(); //..initialize LSW
  19.   }   //for initial values
  20.   for (i=0;i<32;i++) {                 //make sure we have a 32-bit basis..
  21.     r[i] |= k;                         //..by setting each bit
  22.     r[i+1] &= ~k;                      //..and resetting it, too
  23.     k<<=1;                             //..go to next bit
  24.   }   //for basis-ensuring
  25.   index=0;
  26.   for (i=0;i<32;i++) rnd();
  27. }   //R250::R250(void)
  28.  
  29.  
  30. R250::R250(int seed)
  31. {
  32.   int i;
  33.   DWORD k=1;
  34.  
  35.   srand(seed);
  36.   for (i=0;i<SIZE;i++) {               //put in initial random numbers
  37.     HIWORD(r[i])=(rand()<<1) ^ rand(); //..initialize MSW, rand onl
  38.     LOWORD(r[i])=(rand()<<1) ^ rand(); //..initialize LSW
  39.   }   //for initial values
  40.   for (i=0;i<32;i++) {                 //make sure we have a 32-bit basis..
  41.     r[i] |= k;                         //..by setting each bit
  42.     r[i+1] &= ~k;                      //..and resetting it, too
  43.     k<<=1;                             //..go to next bit
  44.   }   //for basis-ensuring
  45.   index=0;
  46. }   //R250::R250(int seed)
  47.  
  48.  
  49. DWORD R250::rnd(void)
  50. {
  51.   register DWORD v;
  52.  
  53.   if (index>=PREV)
  54.     v=r[index] ^ r[index-PREV];
  55.   else
  56.     v=r[index] ^ r[index+SIZE-PREV];
  57.   r[index++]=v;
  58.   if (index>=SIZE) index=0;
  59.   return v;
  60. }   //DWORD R250::rnd(void)
  61.  
  62.  
  63.