On 05/18/2016 04:05 PM, Peter Uhnák wrote:
My questions:
1) do we really want to have global fixed seed?
No!
2) Random new should actually setup a usable seed so I don't need to
first run it N times before I can use the value
Yes.
3) Should we switch to what UUIDGenerator is using… reading
/dev/urandom for the initial seed setup?
Yes.
Though this only works on Unix, so on Windows it uses the current time
as a seed. It might get better results using #microsecondClockValue
instead of #millisecondClockValue. And I'd think about just taking the
microsecond value and sending it #hashMultiply instead of the weird
things it's doing now. (bitXor with the identity hash of the
UUIDGenerator instance? That depends on the randomness of identity
hashes, which may or may not be very good.)
It seems likely that Windows has a built-in random number generator, as
well, which would probably be better.
While we're at it, the class Random is a Park-Miller generator, which
has quite poor randomness by modern standards. Most other Smalltalks
have upgraded -- GemStone uses CMWC (pure Smalltalk, very simple and
quite fast; I wrote that one), VW I believe uses Lagged Fibonacci, and
Squeak has moved to Mersenne Twister last I heard. I've tested all three
against statistical tests of randomness -- generated about 650GB of
random bytes from each, ran them through the tests (which require that
much data to get good statistics).
All three are pretty good, only failing a few tests. The only generator
I tested that passed *all* tests was Linux /dev/urandom. Which is also
fast. If you're on Linux, and don't need a repeatable random sequence,
I'd use /dev/urandom. If you do need to be able to have a repeatable
sequence with good randomness properties, I'd use one of the three
generators I mentioned above. Of the three, the simplest and fastest is
CMWC.
Regards,
-Martin