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.