RandomNumberGenerator
namespace System.Diagnostics
{
internal sealed class RandomNumberGenerator
{
[ThreadStatic]
private static RandomNumberGenerator t_random;
private ulong _s0;
private ulong _s1;
private ulong _s2;
private ulong _s3;
public static RandomNumberGenerator Current {
get {
if (t_random == null)
t_random = new RandomNumberGenerator();
return t_random;
}
}
public unsafe RandomNumberGenerator()
{
do {
Guid guid = Guid.NewGuid();
Guid guid2 = Guid.NewGuid();
ulong* ptr = (ulong*)(&guid);
ulong* ptr2 = (ulong*)(&guid2);
_s0 = *ptr;
_s1 = ptr[1];
_s2 = *ptr2;
_s3 = ptr2[1];
_s0 = (ulong)((long)(_s0 & 1152921504606846975) | ((long)_s1 & -1152921504606846976));
_s2 = (ulong)((long)(_s2 & 1152921504606846975) | ((long)_s3 & -1152921504606846976));
_s1 = (ulong)(((long)_s1 & -193) | (long)(_s0 & 192));
_s3 = (ulong)(((long)_s3 & -193) | (long)(_s2 & 192));
} while ((_s0 | _s1 | _s2 | _s3) == 0);
}
private ulong Rol64(ulong x, int k)
{
return (x << k) | (x >> 64 - k);
}
public long Next()
{
ulong result = Rol64(_s1 * 5, 7) * 9;
ulong num = _s1 << 17;
_s2 ^= _s0;
_s3 ^= _s1;
_s1 ^= _s2;
_s0 ^= _s3;
_s2 ^= num;
_s3 = Rol64(_s3, 45);
return (long)result;
}
}
}