home *** CD-ROM | disk | FTP | other *** search
/ Chip Hitware 7 / Chip_Hitware_Vol_07.iso / chiphit7 / spiele / bgpro / knuth.c_ / knuth.c
Encoding:
C/C++ Source or Header  |  1996-01-26  |  1.8 KB  |  101 lines

  1. #include "windows.h"
  2. #include "stdlib.h"
  3. #include "stdio.h"
  4. #include "bios.h"
  5.  
  6. #include "knuth.h"
  7.  
  8. #define HIGHW(L) (*(((unsigned short *) &(L))+1))
  9. #define LOWW(L) (*(unsigned short *) &(L))
  10.  
  11. static unsigned long aulRndValTable[64];
  12. static unsigned long aulRndNumTable[55];
  13.  
  14. static int k, j;
  15.  
  16. static unsigned long RndAdditive(void)
  17. {
  18.     unsigned long ulRndVal;
  19.  
  20.     ulRndVal=aulRndNumTable[j]+aulRndNumTable[k];
  21.     aulRndNumTable[k]=ulRndVal;
  22.     j=(j+54)%55;
  23.     k=(k+54)%55;
  24.  
  25.     return ulRndVal;
  26. }
  27.  
  28. static unsigned long ulSeed;
  29. static unsigned long ulMul=1664525;
  30.  
  31. static unsigned long RndLinearCongr(void)
  32. {
  33.     unsigned short us1;
  34.  
  35.     us1=LOWW(ulMul)*HIGHW(ulSeed);
  36.     us1+=HIGHW(ulMul)*LOWW(ulSeed);
  37.  
  38.     ulSeed=((unsigned long) LOWW(ulMul)*LOWW(ulSeed));
  39.     ulSeed+=(((unsigned long) us1)<<16);
  40.     ulSeed+=1;
  41.     return ulSeed;
  42. }
  43.  
  44. static void RndSetup(void)
  45. {
  46.     int i;
  47.  
  48.  
  49.     for (i=0; i<64; i++)
  50.     {
  51.         aulRndValTable[i]=RndLinearCongr();
  52.     }
  53.  
  54.     for (i=0; i<55; i++)
  55.     {
  56.         aulRndNumTable[i]=RndLinearCongr();
  57.     }
  58.     j=23;
  59.     k=54;
  60. }
  61.  
  62. static void Randomize(void)
  63. {
  64.     _bios_timeofday(_TIME_GETCLOCK, (long*) &ulSeed);
  65.     RndSetup();
  66. }
  67.  
  68. unsigned short _export __far __pascal GetRandom(unsigned short usMod)
  69. {
  70.     unsigned long ulRndVal;
  71.     unsigned long ulVal1, ulVal2;
  72.     unsigned short usNdx;
  73.  
  74.     ulRndVal=RndAdditive();
  75.  
  76.     usNdx=((HIGHW(ulRndVal)>>8)&0xFC)/4;
  77.     ulVal1=aulRndValTable[usNdx];
  78.     aulRndValTable[usNdx]=ulRndVal;
  79.     ulRndVal=ulVal1;
  80.  
  81.     ulVal1=(unsigned long) LOWW(ulRndVal)*usMod;
  82.     ulVal2=(unsigned long) HIGHW(ulRndVal)*usMod;
  83.     ulVal2+=HIGHW(ulVal1);
  84.     return HIGHW(ulVal2);
  85. }
  86.  
  87. int FAR PASCAL LibMain( HINSTANCE hInstance, WORD wDataSegment,
  88.                                    WORD wHeapSize, LPSTR lpszCmdLine )
  89. {
  90.     if ( wHeapSize != 0 )
  91.         UnlockData( 0 );
  92.  
  93.     Randomize();
  94.     return 1;
  95. }
  96.  
  97. int FAR PASCAL WEP ( int bSystemExit )
  98. {
  99.     return 1;
  100. }
  101.