Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!ames!pasteur!agate!ucbvax!hplabs!hp-pcd!hplsla!jima From: jima@hplsla.HP.COM (Jim Adcock) Newsgroups: comp.lang.c Subject: Re: How do I get random #s? Message-ID: <5260009@hplsla.HP.COM> Date: 9 Feb 89 19:19:23 GMT References: <19415@dhw68k.cts.com> Organization: HP Lake Stevens, WA Lines: 42 /* 1) caveat emptor */ /* 2) assumes 16 bit shorts, 32 bit longs */ /* 3) takes about 15 uSec on a mid performance 68020 system, takes about 4 uSec on a 840 system */ /* 4) pseudo random noise generator, 31 bit long shift register, Mersenne prime, 16 shifts calculated at a time, returning a 16-bit unsigned short. Sequence length 2,147,483,647 */ static prngshift = 3141592654; unsigned short prng(); void prnginit(initseed) unsigned long initseed; { register i; initseed *= 456295141; prngshift = initseed^3141592654; if (!prngshift) prngshift = 3141592654; for (i=0; i<6; ++i) prng(); } unsigned short prng() { register unsigned long d0, d1; register unsigned short lo; d1 = prngshift; d0 = d1>>16; d1 <<= 16; d0 |= d1; d0 = d0<<1 | d0>>31; lo = d0; d0 = d0<<4 | d0>>28; lo ^= d0; d0 = d0<<8 | d0>>24; lo ^= d0; d0 = d0<<2 | d0>>30; lo ^= d0; d1 |= lo; prngshift = d1; return lo; }