home *** CD-ROM | disk | FTP | other *** search
- #include <windows.h>
-
- #include <stdio.h>
- #include <math.h>
- #include <bios.h>
-
- #include "marsagli.h"
-
- #define NO_NUMBERS 16777216
-
- #define CD 7654321
- #define CM 16777213
- #define LASTDIM 98
- #define FIRSTDIM 34
-
- static int j, k;
- static long c;
-
- static unsigned long ulSeed;
- static unsigned long x[LASTDIM];
-
- static void RndSetup(void)
- {
- int n1, n2, n3, n4, ii, jj, m;
- int ij, kl;
- float s, t;
-
- ij = (int) (ulSeed) % 31328;
- kl = (int) ((ulSeed >> 16) % 30081);
- n1 = (ij / 177) % 177 + 2;
- n2 = ij % 177 + 2;
- n3 = (kl / 169) % 178 + 1;
- n4 = kl % 169;
-
- for (ii = 1; ii <= LASTDIM - 1; ii++)
- {
- s = (float) 0.0;
- t = (float) 0.5;
- for (jj = 1; jj <= 24; jj++)
- {
- m = (((n1 * n2) % 179) * n3) % 179;
- n1 = n2;
- n2 = n3;
- n3 = m;
- n4 = (53 * n4 + 1) % 169;
- if ((n4 * m) % 64 >= 32)
- s += t;
- t *= (float) 0.5;
- }
- x[ii] = (long) floor(s * NO_NUMBERS);
- }
-
- c = 362436;
-
- k = FIRSTDIM - 1;
- j = LASTDIM - 1;
- }
-
- static void Randomize(void)
- {
- _bios_timeofday(_TIME_GETCLOCK, (long *) &ulSeed);
- RndSetup();
- }
-
- unsigned short _export __far __pascal GetRandom(unsigned short usMod)
- {
- long uni;
-
- uni = x[j] - x[k];
- if (uni < 0)
- {
- uni += NO_NUMBERS;
- }
- x[j] = uni;
- j--;
- if (j <= 0)
- {
- j = LASTDIM - 1;
- }
-
- k--;
- if (k <= 0)
- {
- k = LASTDIM - 1;
- }
-
- c -= CD;
- if (c < 0)
- {
- c += CM;
- }
-
- uni -= c;
- if (uni < 0)
- {
- uni += NO_NUMBERS;
- }
- return (unsigned short) ((unsigned long) uni%usMod);
- }
-
- int FAR PASCAL LibMain( HINSTANCE hInstance, WORD wDataSegment,
- WORD wHeapSize, LPSTR lpszCmdLine )
- {
- if ( wHeapSize != 0 )
- UnlockData( 0 );
-
- Randomize();
- return 1;
- }
-
- int FAR PASCAL WEP ( int bSystemExit )
- {
- return 1;
- }
-