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 <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