Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: FRC start position generator

Author: Dieter Buerssner

Date: 17:42:22 06/07/04

Go up one level in this thread


On June 07, 2004 at 20:28:51, Dann Corbit wrote:

>On June 07, 2004 at 20:19:12, Dann Corbit wrote:
>
>>ftp://cap.connx.com/pub/chess-engines/new-approach/frcpos.c
>
>It would be a lot better as a C++ class with srand((unsigned)time(NULL)) in the
>constructor.  Also, the C/C++ prng of questionable quality would be much better
>replaced by the Mersenne Twister.  In fact, the MT prng is so good, you could
>replace the monkey business with floating point and division by a modulus
>operator.

For this purpose - yes. In general both approaches are flawed, because not all
positions will be returned with exactly the same probability. RAND_MAX%960 != 0.
I know, that your method is the method advertized at many places. I don't like
it too much. It is possibly dangerous for some simulations. A better method is,
to find the largest value x <= RAND_MAX, for which x % 960 == 0. Then skip all
returns of rand() > x. Like in the following function:

unsigned rand_range(unsigned range)
{
  unsigned long rmax, r, d;
  /* find the largest number rmax <= MY_RAND_MAX, for which
     (rmax+1) % range == 0.
     All returns from rand() > rmax will be skipped, to guarantee
     equal probability for all return values. */
  d = (MY_RAND_MAX+1U-range) / range + 1;
  rmax = d * range - 1; /* -1 to avoid "overflow to zero" */
  do
    r = PRNG();
  while (r > rmax);
  return r/d;
}


Which guarantees equal probability for all values.

From your code:

    index = (size_t) ((double) rand() / ((double) RAND_MAX + 1) * 980);

The 980 does not look right.

Regards,
Dieter



This page took 0 seconds to execute

Last modified: Thu, 15 Apr 21 08:11:13 -0700

Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.