Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: How to create a set of random integers for hashing?

Author: Robert Hyatt

Date: 10:45:19 10/18/98

Go up one level in this thread


On October 18, 1998 at 10:57:04, Ed Schröder wrote:

>>>#define LENGTH 64*12
>>>
>>>int random [LENGTH];
>>>
>>>int a,b,c,d,x;
>>>
>>>srand(9);                    // initialize prime number
>>>
>>>for (x=0; x<LENGTGH; x++)
>>> { a=rand(); b=rand(); if (b & 1) a=a | 0x8000;
>>>   c=rand(); d=rand(); if (d & 1) c=c | 0x8000;
>>>   random[x]=(a<<16)+c;
>>> }
>>>
>>>I wonder how good such a system is and how others do it.
>>>
>>>- Ed -
>>
>>
>>First, I don't use "rand()" at all.  I ran some tests on it when
>>I started the crafty project and didn't like the result.  Instead, I
>>took the 32 bit random number generator from the well-known numerical
>>book "Numerical Recipes".  It is far better, and you can certainly take
>>the source to this directly from crafty since this piece of code is
>>also public domain.
>
>Can you post this code? In case you answer with a Crafty ".C" file where can
>download Crafty's code?
>
>- Ed -
>
>
>>I use 64 bit random numbers for hashing and ran a lot of hamming distance
>>tests to be sure the numbers looked ok, and was satisfied...


it's in utility.c, but here is the code for 32 bit values:

/*

A 32 bit random number generator. An implementation in C of the algorithm given
by
Knuth, the art of computer programming, vol. 2, pp. 26-27. We use e=32, so
we have to evaluate y(n) = y(n - 24) + y(n - 55) mod 2^32, which is implicitly
done by unsigned arithmetic.

*/

unsigned int Random32(void)
{
  /*
  random numbers from Mathematica 2.0.
  SeedRandom = 1;
  Table[Random[Integer, {0, 2^32 - 1}]
  */
  static unsigned long x[55] = {
    1410651636UL, 3012776752UL, 3497475623UL, 2892145026UL, 1571949714UL,
    3253082284UL, 3489895018UL, 387949491UL, 2597396737UL, 1981903553UL,
    3160251843UL, 129444464UL, 1851443344UL, 4156445905UL, 224604922UL,
    1455067070UL, 3953493484UL, 1460937157UL, 2528362617UL, 317430674UL,
    3229354360UL, 117491133UL, 832845075UL, 1961600170UL, 1321557429UL,
    747750121UL, 545747446UL, 810476036UL, 503334515UL, 4088144633UL,
    2824216555UL, 3738252341UL, 3493754131UL, 3672533954UL, 29494241UL,
    1180928407UL, 4213624418UL, 33062851UL, 3221315737UL, 1145213552UL,
    2957984897UL, 4078668503UL, 2262661702UL, 65478801UL, 2527208841UL,
    1960622036UL, 315685891UL, 1196037864UL, 804614524UL, 1421733266UL,
    2017105031UL, 3882325900UL, 810735053UL, 384606609UL, 2393861397UL };
  static int init = 1;
  static unsigned long y[55];
  static int j, k;
  unsigned long ul;

  if (init)
  {
    int i;

    init = 0;
    for (i = 0; i < 55; i++) y[i] = x[i];
    j = 24 - 1;
    k = 55 - 1;
  }

  ul = (y[k] += y[j]);
  if (--j < 0) j = 55 - 1;
  if (--k < 0) k = 55 - 1;
  return((unsigned int)ul);
}




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.