Author: Amir Ban
Date: 07:36:58 10/18/98
Go up one level in this thread
On October 18, 1998 at 10:15:54, Ed Schröder wrote: >>>Since ages I use the following formula for creating a set of random >>>integers for hashing at program start: > >>>#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 - > >>>From the definition of LENGTH I guess these are piece-square tables you are >>generating. > >Yes. > >>I do the same, but I generate 48-bit numbers (actually only 45-bit, because I >>don't bother completing the MSbit), not 32-bit as you do. I think it's >>generally acknowledged that 32-bit is not enough ? > >Let me give an example with a 32-bit hash-key: > >Total positions searched : 1,386,498 >Hash errors : 453 > >These 453 errors are discovered checking the positions when a hash hit occurs >so they are 100% examples the hash algorithm fails. I find this number quite >(much too) high. > >When I increase the number of bits to 40 or 48 the number of errors drops to >(say) 200 / 150. Still much to high IMO. > >So my suspect goes to random generator. > >- Ed - > > >>Amir This sounds wrong indeed. Try this rand function (this is the Borland implementation). I use srand(0), though I don't believe it matters. #define MULTIPLIER 0x015a4e35L #define INCREMENT 1 static long Seed = 1; void __cdecl srand(unsigned seed) { Seed = seed; } int __cdecl rand(void) { Seed = MULTIPLIER * Seed + INCREMENT; return((int)(Seed >> 16) & 0x7fff); } Amir
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.