Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
RandomNumberGenerator.cs
Go to the documentation of this file.
1namespace System.Diagnostics;
2
3internal sealed class RandomNumberGenerator
4{
5 [ThreadStatic]
7
8 private ulong _s0;
9
10 private ulong _s1;
11
12 private ulong _s2;
13
14 private ulong _s3;
15
17 {
18 get
19 {
20 if (t_random == null)
21 {
23 }
24 return t_random;
25 }
26 }
27
28 public unsafe RandomNumberGenerator()
29 {
30 do
31 {
32 Guid guid = Guid.NewGuid();
33 Guid guid2 = Guid.NewGuid();
34 ulong* ptr = (ulong*)(&guid);
35 ulong* ptr2 = (ulong*)(&guid2);
36 _s0 = *ptr;
37 _s1 = ptr[1];
38 _s2 = *ptr2;
39 _s3 = ptr2[1];
40 _s0 = (_s0 & 0xFFFFFFFFFFFFFFFuL) | (_s1 & 0xF000000000000000uL);
41 _s2 = (_s2 & 0xFFFFFFFFFFFFFFFuL) | (_s3 & 0xF000000000000000uL);
42 _s1 = (_s1 & 0xFFFFFFFFFFFFFF3FuL) | (_s0 & 0xC0);
43 _s3 = (_s3 & 0xFFFFFFFFFFFFFF3FuL) | (_s2 & 0xC0);
44 }
45 while ((_s0 | _s1 | _s2 | _s3) == 0L);
46 }
47
48 private ulong Rol64(ulong x, int k)
49 {
50 return (x << k) | (x >> 64 - k);
51 }
52
53 public long Next()
54 {
55 ulong result = Rol64(_s1 * 5, 7) * 9;
56 ulong num = _s1 << 17;
57 _s2 ^= _s0;
58 _s3 ^= _s1;
59 _s1 ^= _s2;
60 _s0 ^= _s3;
61 _s2 ^= num;
62 _s3 = Rol64(_s3, 45);
63 return (long)result;
64 }
65}
static Guid NewGuid()
Definition Guid.cs:1283