home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
rtsi.com
/
2014.01.www.rtsi.com.tar
/
www.rtsi.com
/
OS9
/
MM1
/
GRAPHICS
/
ssaver.lzh
/
SRC
/
rand.c
< prev
next >
Wrap
Text File
|
1995-04-02
|
2KB
|
99 lines
/*
* A very random generator, period approx 6.8064e16.
*
* Uses algorithm M, "Art of Computer Programming", Vol 2. 1969, D.E.Knuth.
*
* Two generators are used to derive the high and low parts of sequence X, and
* another for sequence Y. These were derived by Michael Mauldin.
*
* Usage: initialize by calling srand(seed), then rand() returns a random
* number from 0..2147483647. srand(0) uses the current time as the seed.
*
* Author: Michael Mauldin, June 14, 1983. adapted to OS-9/68000 C-Library by
* Christian Engel, Sat Oct 17 01:39:27 1987
*/
/*
** time () called with NULL argument and <stdio.h> included
** randint (non ANSI) commented
** AM 20/12/90
*/
#ifndef NULL
#include <stdio.h>
#endif
/*
* Rand 1, period length 444674
*/
#define MUL1 1156
#define OFF1 312342
#define MOD1 1334025
#define RAND1 (seed1=((seed1*MUL1+OFF1)%MOD1))
#define Y RAND1
/*
* Rand 2, period length 690709
*/
#define MUL2 1366
#define OFF2 827291
#define MOD2 1519572
#define RAND2 (seed2=((seed2*MUL2+OFF2)%MOD2))
/*
* Rand 3, period length 221605
*/
#define MUL3 1156
#define OFF3 198273
#define MOD3 1329657
#define RAND3 (seed3=((seed3*MUL3+OFF3)%MOD3))
/*
* RAND2 generates 19 random bits, RAND3 generates 17. The X sequence is made
* up off both, and thus has 31 random bits.
*/
#define X ((RAND2<<13 ^ RAND3>>3) & 017777777777)
#define AUXLEN 97
static int seed1 = 872978, seed2 = 518652, seed3 = 226543;
static int auxtab[AUXLEN];
/*
* s r a n d
*/
srand(seed)
int seed;
{
register int i;
if (seed == 0)
seed = time(NULL);
/*
* Set the three random number seeds
*/
seed1 = (seed1 + seed) % MOD1;
seed2 = (seed2 + seed) % MOD2;
seed3 = (seed3 + seed) % MOD3;
for (i = AUXLEN; i--;)
auxtab[i] = X;
}
/*
* r a n d
*/
int rand()
{
register int j, result;
j = AUXLEN * Y / MOD1; /* j random from 0..AUXLEN-1 */
result = auxtab[j];
auxtab[j] = X;
return(result);
}