Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
UnifiedRandom.cs
Go to the documentation of this file.
1using System;
2
3namespace Terraria.Utilities;
4
6public class UnifiedRandom
7{
8 private const int MBIG = int.MaxValue;
9
10 private const int MSEED = 161803398;
11
12 private const int MZ = 0;
13
14 private int inext;
15
16 private int inextp;
17
18 private int[] SeedArray = new int[56];
19
21 : this(Environment.TickCount)
22 {
23 }
24
25 public UnifiedRandom(int Seed)
26 {
27 SetSeed(Seed);
28 }
29
30 public void SetSeed(int Seed)
31 {
32 for (int i = 0; i < SeedArray.Length; i++)
33 {
34 SeedArray[i] = 0;
35 }
36 int num = ((Seed == int.MinValue) ? int.MaxValue : Math.Abs(Seed));
37 int num2 = 161803398 - num;
38 SeedArray[55] = num2;
39 int num3 = 1;
40 for (int j = 1; j < 55; j++)
41 {
42 int num4 = 21 * j % 55;
43 SeedArray[num4] = num3;
44 num3 = num2 - num3;
45 if (num3 < 0)
46 {
47 num3 += int.MaxValue;
48 }
49 num2 = SeedArray[num4];
50 }
51 for (int k = 1; k < 5; k++)
52 {
53 for (int l = 1; l < 56; l++)
54 {
55 SeedArray[l] -= SeedArray[1 + (l + 30) % 55];
56 if (SeedArray[l] < 0)
57 {
58 SeedArray[l] += int.MaxValue;
59 }
60 }
61 }
62 inext = 0;
63 inextp = 21;
64 }
65
66 protected virtual double Sample()
67 {
68 return (double)InternalSample() * 4.656612875245797E-10;
69 }
70
71 private int InternalSample()
72 {
73 int num = inext;
74 int num2 = inextp;
75 if (++num >= 56)
76 {
77 num = 1;
78 }
79 if (++num2 >= 56)
80 {
81 num2 = 1;
82 }
83 int num3 = SeedArray[num] - SeedArray[num2];
84 if (num3 == int.MaxValue)
85 {
86 num3--;
87 }
88 if (num3 < 0)
89 {
90 num3 += int.MaxValue;
91 }
92 SeedArray[num] = num3;
93 inext = num;
94 inextp = num2;
95 return num3;
96 }
97
98 public virtual int Next()
99 {
100 return InternalSample();
101 }
102
103 private double GetSampleForLargeRange()
104 {
105 int num = InternalSample();
106 if (InternalSample() % 2 == 0)
107 {
108 num = -num;
109 }
110 return ((double)num + 2147483646.0) / 4294967293.0;
111 }
112
113 public virtual int Next(int minValue, int maxValue)
114 {
115 if (minValue > maxValue)
116 {
117 throw new ArgumentOutOfRangeException("minValue", "minValue must be less than maxValue");
118 }
119 long num = (long)maxValue - (long)minValue;
120 if (num <= int.MaxValue)
121 {
122 return (int)(Sample() * (double)num) + minValue;
123 }
124 return (int)((long)(GetSampleForLargeRange() * (double)num) + minValue);
125 }
126
127 public virtual int Next(int maxValue)
128 {
129 if (maxValue < 0)
130 {
131 throw new ArgumentOutOfRangeException("maxValue", "maxValue must be positive.");
132 }
133 return (int)(Sample() * (double)maxValue);
134 }
135
136 public virtual double NextDouble()
137 {
138 return Sample();
139 }
140
141 public virtual void NextBytes(byte[] buffer)
142 {
143 if (buffer == null)
144 {
145 throw new ArgumentNullException("buffer");
146 }
147 for (int i = 0; i < buffer.Length; i++)
148 {
149 buffer[i] = (byte)(InternalSample() % 256);
150 }
151 }
152}
static double Abs(double value)
virtual void NextBytes(byte[] buffer)
virtual int Next(int minValue, int maxValue)
virtual int Next(int maxValue)