Mail Archives: djgpp/2000/03/09/12:08:27
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
|
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
- Raw text -