[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Zobrist [was Re: computer-go: ko [was: Applying Moore's Law to Computer Go]]
At 01:01 PM 11/28/1999 -0500, you wrote:
>
>
>Dave Dyer <ddyer@xxxxxxxxxxxxxxxxx> writes:
>
>> if you use Zorbrist hashing, you can trivially detect duplicate positions.
>>
>>
>
>Hi,
>
> Could somebody please give me some pointers on where to find
>information on zobrist hashing (besides getting hold of his thesis).
Myriam,
Here's a code-fragment:
#define NCOLORS 2 /* Number of colors: white black */
#define NPIECES 6 /* Number of pieces: pawn, knight, etc. */
#define white 0 /* White */
#define black 1 /* Black */
/* The Zobrist hashing scheme.*/
unsigned int hashvals[NCOLORS][NPIECES][64];
unsigned int hashkey;
/*
* 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);
}
/* Fill the Zobrist hash value array with random numbers */
void hashfill(b)
board_t *b;
{
color_t c;
piece_t pc;
int sq;
for (c = white; c <= black; c++)
for (pc = pawn; pc <= king; pc++)
for (sq = 0; sq < 120; sq++)
hashvals[c][pc][sq] = Random32();
}
/* When making or unmaking a move */
hashkey ^= hashvals[color_of_moving_piece][piece_number][from_square];
hashkey ^= hashvals[color_of_moving_piece][piece_number][to_square];
With deference to collisions, the "hashkey" becomes a
pseudo-unique number describing the "current" position.
Increase the number of bits in hashkey and the randomizer
to produce fewer collisions.
--Stuart