Ah, you also need the sign conversion applied to the uses of seed in right 
shifts, but that's still a simplification.

Eliot (phone)

On Apr 3, 2015, at 7:15 AM, Stefan Marr <smallt...@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/
> 
> 
> 
> 

Reply via email to