Re: Generating 2 independent random numbers
On May 29, 6:30 am, Jerry Coffin <jcof...@taeus.com> wrote:
In article <g1jpsm$h5...@aioe.org>, bilgek...@bilgekhanbilgekhan.net.tr
says...
[ ... ]
Because it is the same sequence of the RNG... :-)
A seed sequence of rand() always generates
RAND_MAX different random numbers.
False. It usually _will_, but there's no guarantee of it.
As far as the standard goes, no. All the standard says is that
"The rand function computes a sequence of pseudo-random integers
in the range 0 to RAND_MAX." It doesn't say anything about the
quality of this sequence, nor even define what it means by
"pseudo-random integers". These issues are left to quality of
implementation considerations.
Presumably, something like:
#define RAND_MAX 60000
inline void srand( unsigned ) {}
inline int rand() { return 1 ; }
would be conforming, although it's really stretching the
definition of "pseudo-random integers", and it would certainly
not be considered to have acceptable quality, from a QoI point
of view. The C standard contains an example implementation,
which is however known to be "bad".
In general, if some particular "quality" of the random numbers
is important, you won't use std::rand(), but rather a known
generator with known characteristics. (The next version of the
C++ standard will contain a number of these.)
So within a sequence it cannot generate the same number
twice.
Even more thoroughly false. I've cut out a bunch more
statements, but they all reflect the same misconception.
You're assuming that RAND_MAX reflects not only the range, but also the
period of the PRNG. While the standard's definition is loose enough to
_allow_ that, it's most assuredly not required. I'd add that, IMO, such
an implementation is _far_ from ideal.
From a practical viewpoint, having the range and the period of
the generator equal appears to be fairly unusual.
Let's say that if the range is something like 32767, it would be
a very, very poor generator which didn't have a longer period.
A 32 bit linear congruent generator like that described in
"Random Number Generators: Good Ones Are Hard to Find" (Park and
Miller, CACM, Oct. 1988) will have both RAND_MAX and the period
equal to 2147483647 (or something similar).
For example, consider the
following code:
#include <stdlib.h>
#include <iostream>
int main() {
srand(1);
int i;
for (i=0; i<9; i++)
std::cout << rand() << "\t";
std::cout << "\n";
for (; i<RAND_MAX; i++)
rand();
for (i=0; i<9; i++)
std::cout << rand() << "\t";
std::cout << "\n";
return 0;
}
According to your statements, the two lines should be
identical (with a possible offset).
If the period of the generator is RAND_MAX, the middle loop
should execute RAND_MAX-9, not RAND_MAX, for the two lines to
be the same.
Not that that actually changes the concrete results. As you
say, the period is almost always longer than RAND_MAX. (On a
lot of systems, RAND_MAX is only 32767, presumably for some
obscure historical reason.)
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34