From: buers AT gmx DOT de (Dieter Buerssner) Newsgroups: comp.os.msdos.djgpp Subject: Re: Random Numbers Date: 9 Mar 2000 13:33:14 GMT Lines: 33 Message-ID: <8a896n$3aa3v$1@fu-berlin.de> References: <8a6fpg$gjg$1 AT news8 DOT svr DOT pol DOT co DOT uk> NNTP-Posting-Host: pec-0-225.tnt1.s2.uunet.de (149.225.0.225) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Trace: fu-berlin.de 952608794 3483775 149.225.0.225 (16 [17104]) X-Posting-Agent: Hamster/1.3.13.0 User-Agent: Xnews/03.02.04 To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com Ben Davis wrote: >I know what random() and srandom() are. But what are initstate() and >setstate()? The help files are very unspecific. I'd be grateful if anyone >could explain them to me. random() works like this: return r[n] = (r[n-l] + r[n-s]) >> 1; /* nth random number */ So you have to store the max(l,s) last random numbers in an array used as a cyclic buffer. In the default mode (without using initstate) l and s are 31 and 3. When you call initstate, you give a buffer for the state information and the function will look, what are the largest suitable l and s to fit in your buffer. It will from then on work with your buffer as its state array (also 2 pointers needed for the cyclic buffer and some other internal information will be stored in this buffer). If you stop some simulation, that you want to continue at an other time, you could store your buffer to disk, and at this other time, you could use setstate() to initialize random() to exactly that state, were you stopped. If you have the libsrc installed, you can find out more in src/libc/compat/stdlib/random.c BTW. I would not suggest random() for seriuos simulations. The constanst l and s must be properly choosen. I have articles with lists of suggested values for l and s, the values in hardcoded in random() are not on these lists. Regards, Dieter