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

  1. #include <windows.h>
  2.  
  3. #include <stdio.h>
  4. #include <math.h>
  5. #include <bios.h>
  6.  
  7. #include "marsagli.h"
  8.  
  9. #define NO_NUMBERS   16777216
  10.  
  11. #define CD     7654321
  12. #define CM     16777213
  13. #define LASTDIM   98
  14. #define FIRSTDIM  34
  15.  
  16. static int j, k;
  17. static long c;
  18.  
  19. static unsigned long ulSeed;
  20. static unsigned long x[LASTDIM];
  21.  
  22. static void RndSetup(void)
  23. {
  24.    int n1, n2, n3, n4, ii, jj, m;
  25.    int ij, kl;
  26.    float s, t;
  27.  
  28.    ij = (int) (ulSeed) % 31328;
  29.    kl = (int) ((ulSeed >> 16) % 30081);
  30.    n1 = (ij / 177) % 177 + 2;
  31.    n2 = ij % 177 + 2;
  32.    n3 = (kl / 169) % 178 + 1;
  33.    n4 = kl % 169;
  34.  
  35.    for (ii = 1; ii <= LASTDIM - 1; ii++)
  36.    {
  37.       s = (float) 0.0;
  38.       t = (float) 0.5;
  39.       for (jj = 1; jj <= 24; jj++)
  40.       {
  41.           m = (((n1 * n2) % 179) * n3) % 179;
  42.           n1 = n2;
  43.           n2 = n3;
  44.           n3 = m;
  45.           n4 = (53 * n4 + 1) % 169;
  46.           if ((n4 * m) % 64 >= 32)
  47.              s += t;
  48.           t *= (float) 0.5;
  49.       }
  50.       x[ii] = (long) floor(s * NO_NUMBERS);
  51.    }
  52.  
  53.    c = 362436;
  54.  
  55.    k = FIRSTDIM - 1;
  56.    j = LASTDIM - 1;
  57. }
  58.  
  59. static void Randomize(void)
  60. {
  61.     _bios_timeofday(_TIME_GETCLOCK, (long *) &ulSeed);
  62.     RndSetup();
  63. }
  64.  
  65. unsigned short _export __far __pascal GetRandom(unsigned short usMod)
  66. {
  67.    long uni;
  68.  
  69.    uni = x[j] - x[k];
  70.    if (uni < 0)
  71.    {
  72.       uni += NO_NUMBERS;
  73.    }
  74.    x[j] = uni;
  75.    j--;
  76.    if (j <= 0)
  77.    {
  78.       j = LASTDIM - 1;
  79.    }
  80.  
  81.    k--;
  82.    if (k <= 0)
  83.    {
  84.       k = LASTDIM - 1;
  85.    }
  86.  
  87.    c -= CD;
  88.    if (c < 0)
  89.    {
  90.       c += CM;
  91.    }
  92.  
  93.    uni -= c;
  94.    if (uni < 0)
  95.    {
  96.       uni += NO_NUMBERS;
  97.    }
  98.    return (unsigned short) ((unsigned long) uni%usMod);
  99. }
  100.  
  101. int FAR PASCAL LibMain( HINSTANCE hInstance, WORD wDataSegment,
  102.                                    WORD wHeapSize, LPSTR lpszCmdLine )
  103. {
  104.     if ( wHeapSize != 0 )
  105.         UnlockData( 0 );
  106.  
  107.     Randomize();
  108.     return 1;
  109. }
  110.  
  111. int FAR PASCAL WEP ( int bSystemExit )
  112. {
  113.     return 1;
  114. }
  115.