Hi Stefan, if seed is Andes with 16rffffffff when it is initialized then the Java code can be used to generate the next value and the sign conversion only applied once to yield the next value. That would eliminate lots of conversions and make the code readable, right? Eliot (phone) On Apr 3, 2015, at 7:15 AM, Stefan Marr <smalltalk@stefan-marr.de> wrote:
Hi:
I am porting some benchmarks to Pharo, which rely on a deterministic random number generator that uses 32 bit values.
In order to have properly comparable results across platforms, it needs to generated the same sequence of numbers.
So, I am looking for efficient ways to implement it, any ideas? I am a little at a loss, with SmallInts and Long Ints, how to get the proper 32-bit values, and how to apply the correct shifts, especially the right shift can be problematic.
Code examples below.
Thanks Stefan
In Java it looks like this:
private static int seed;
// Robert Jenkins' 32 bit integer hash function. public static int random() { seed = ((seed + 0x7ed55d16) + (seed << 12)) & 0xffffffff; seed = ((seed ^ 0xc761c23c) ^ (seed >>> 19)) & 0xffffffff; seed = ((seed + 0x165667b1) + (seed << 5)) & 0xffffffff; seed = ((seed + 0xd3a2646c) ^ (seed << 9)) & 0xffffffff; seed = ((seed + 0xfd7046c5) + (seed << 3)) & 0xffffffff; seed = ((seed ^ 0xb55a4f09) ^ (seed >>> 16)) & 0xffffffff; return seed; }
In SOM Smalltalk, it looks like this:
JenkinsRandom = ( ---- | seed |
seed: val = ( seed := val )
"Robert Jenkins' 32 bit integer hash function." random = ( seed := ((seed + 2127912214 "0x7ed55d16") + (seed as32BitUnsignedValue << 12) as32BitSignedValue) as32BitSignedValue. seed := ((seed bitXor: 3345072700 "0xc761c23c") bitXor: (seed as32BitUnsignedValue >>> 19)) as32BitSignedValue. seed := ((seed + 374761393 "0x165667B1") + (seed as32BitUnsignedValue << 5) as32BitSignedValue) as32BitSignedValue. seed := ((seed + 3550635116 "0xd3a2646c") bitXor: (seed as32BitUnsignedValue << 9) as32BitSignedValue) as32BitSignedValue. seed := ((seed + 4251993797 "0xfd7046c5") + (seed as32BitUnsignedValue << 3) as32BitSignedValue) as32BitSignedValue. seed := ((seed bitXor: 3042594569 "0xb55a4f09") bitXor: (seed as32BitUnsignedValue >>> 16)) as32BitSignedValue. ^ seed ) )
-- Stefan Marr INRIA Lille - Nord Europe http://stefan-marr.de/research/