[squeak-dev] Random randomness

Ragnar Hojland Espinosa ragnar at ragnar-hojland.com
Fri Aug 22 07:22:16 UTC 2008


On Fri, Aug 22, 2008 at 7:34 AM, Andreas Raab <andreas.raab at gmx.de> wrote:
> Today I've encountered two very interesting issues with respect to Random.
> First, there seems to be a bug when using very large seeds, for example:
>
>  rnd := Random seed: 300000000000.
>  rnd nextInt: 100.
>
> This answers -121 which is just plain completely wrong! Any ideas for how to
> fix this?

It's to be expected given the initialization parameters for the
algorithm so maybe it should throw an exception when it gets a seed
out of range. I'd just use a 32 bit integer as a seed unless I really
wanted to tinker with PRNGs (and I don't given the quirkiness of those
things). Maybe the encryption package(s?) have an alternate one that
you could use if you really need big seeds that you can't reduce.

> Secondly, what is a good way to seed a random number generator that one will
> only pull out very few numbers? We found that a naive approach works very
> badly which is illustrated here:
>
>  1 to: 100 do:[:i|
>    rnd := Random new.
>    Transcript show: (rnd nextInt: 100); space.
>  ].
>
> There is almost no variation in the numbers. If this would be running out of
> one image, I would do something like here:
>
>  base := Random new.
>  1 to: 100 do:[:i|
>    rnd := Random seed: (base nextInt: 1234567).
>    Transcript show: (rnd nextInt: 100); space.
>  ].
>
> which looks much more nicely distributed but unfortunately this code will be
> run in different images. So having something that is based on the millsecond
> clock is probably good but there still seems to be very little variation
> when I run a couple of tests.

But why do you need to keep getting new seeds? Random has this as the
initial default seed:

   seed := (Time millisecondClockValue bitAnd: 16r3FFFFFFF) bitXor: self hash.

so I guess that if you are having issues with multiple machines
accidentally stumbling onto the same random sequence, you could xor
that again with the hash of the hostname and/or the process id of the
image in the system or the process id in the image.

-- 
Ragnar



More information about the Squeak-dev mailing list