Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Interpreting my analysis of the Fine 70 position.

Author: Dieter Buerssner

Date: 16:29:50 07/11/04

Go up one level in this thread


On July 11, 2004 at 19:13:53, Stuart Cracraft wrote:

>I was using something like that but picked up this from Knuth
>by way of GNU & Crafty (and, I suspect, Bob Hyatt)... The question is
>will this suffice for the new 64-bit machines becoming more commonplace
>amongst computer chess programs...

It will most probably run on all modern machines. To make it really portable (to
old machines, that don't have 32-bit ints, or new machines that may have longer
than 32-bit ints, see my suggestions in the code)

>unsigned int Rand32 (void)
unsigned long Rand32 (void)

>/***************************************************************************
>*
> *
> *  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.
> *
>
>***************************************************************************/
>{
>/*
> *  Random numbers from Mathematica 2.0
> *  SeedRandom = 1;
> *  Table[Random[Integer, {0, 2^32 - 1}]
> */
>   static unsigned int x[55] =

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 = true;
>   static unsigned int y[55];

   static unsigned long y[55];

>   static int j, k;
>   unsigned int ul;

unsigned long ul;

>   if (init)
>   {
>      int i;
>      init = false;
>      for (i = 0; i < 55; i++)
>         y[i] = x[i];
>      j = 24 - 1;
>      k = 55 - 1;
>   }
>   ul = (y[k] += y[j]);

  y[k] += y[j];
  ul = (y[k] &= 0xffffffff);


>   if (--j < 0) j = 55 - 1;
>   if (--k < 0) k = 55 - 1;
>   return (ul);
>}

Above changes assume, that efficiency is no issue (it ain't in chess engines).
If it is, one might want to use environment specific types, instead of unsigned
long. Also doing something different about the init and the "local" y table.

Don't use this for serious simulations, without really knowing what you are
doing. Above PRNG (an additive lagged Fibonacci PRNG, from my memory Knuth
suggested subtraction instead of addition for this. But it won't really matter.)
has very serious flaws, and fails some simple tests for randomness. For Zorbrist
hashing there will be no problem.

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.