Re: C# 6+ Random algorithm changed

2022-06-30 Thread Tony McGee

Oh nice, thanks, I missed this news for .NET 6.
I've used Mersenne Twister in the past for an app where the RNG pool 
didn't need to be cryptographically secure but the algorithm did have to 
be explicitly specified in the deliverable.


Also, interesting detail in the implementation as noted - if you just 
use the Random directly, or use the new Random.Shared thread safe 
instance you get xoshiro256**. However, if you seed Random, or derive 
from it then it possibly becomes a breaking change and you get the old 
behaviour: https://source.dot.net/#System.Private.CoreLib/Random.cs


There doesn't seem to be a way to explicitly opt-in or even seed the new 
PRNG implementation though, so looks like it's been done as purely 
performance optimisation, which is interesting.


-Tony

On 1/07/2022 11:22, Greg Keogh via ozdotnet wrote:
TGIF folks, FYI - I discovered by accident yesterday in this article 
 
that the algorithm used by the Random class has changed. Historically 
it has used the Knuth subtractive algorithm 
, which is 
old and respected, and reasonably simple. It holds its internal state 
in a seeded int[56] array (I don't know how it scores on cruel tests 
like BigCrush ).


It's been replaced with one of the set of new *xoroshiro* algorithms, 
which I didn't know about until yesterday. The code is so short that 
you can't believe they actually work and produce results that pass 
tests that even some of the famous ones like Mersenne Twister can 
fail. I'm just amazed by the brevity and quality 
 (C code links top-right).


ILSpy shows how Random has been completely rejigged to use the new 
algorithm or fallback to the internal Net5CompatDerivedImpl class.


/Greg K/



C# 6+ Random algorithm changed

2022-06-30 Thread Greg Keogh
TGIF folks, FYI - I discovered by accident yesterday in this article

that the algorithm used by the Random class has changed. Historically it
has used the Knuth subtractive algorithm
, which is old
and respected, and reasonably simple. It holds its internal state in a
seeded int[56] array (I don't know how it scores on cruel tests like
BigCrush ).

It's been replaced with one of the set of new *xoroshiro* algorithms, which
I didn't know about until yesterday. The code is so short that you can't
believe they actually work and produce results that pass tests that even
some of the famous ones like Mersenne Twister can fail. I'm just amazed by
the brevity and quality  (C code links
top-right).

ILSpy shows how Random has been completely rejigged to use the new
algorithm or fallback to the internal Net5CompatDerivedImpl class.

*Greg K*