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.