-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathSeedRandom.cs
137 lines (126 loc) · 2.6 KB
/
SeedRandom.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
using System;
namespace SuperMetroidRandomizer.Random
{
public class SeedRandom
{
private int inext;
private int inextp;
private readonly int[] SeedArray = new int[56];
public SeedRandom() : this(Environment.TickCount)
{
}
public SeedRandom(int Seed)
{
int num = (Seed == -2147483648) ? 2147483647 : Math.Abs(Seed);
int num2 = 161803398 - num;
SeedArray[55] = num2;
int num3 = 1;
for (int i = 1; i < 55; i++)
{
int num4 = 21 * i % 55;
SeedArray[num4] = num3;
num3 = num2 - num3;
if (num3 < 0)
{
num3 += 2147483647;
}
num2 = SeedArray[num4];
}
for (int j = 1; j < 5; j++)
{
for (int k = 1; k < 56; k++)
{
SeedArray[k] -= SeedArray[1 + (k + 30) % 55];
if (SeedArray[k] < 0)
{
SeedArray[k] += 2147483647;
}
}
}
inext = 0;
inextp = 21;
}
protected virtual double Sample()
{
return InternalSample() * 4.6566128752457969E-10;
}
private int InternalSample()
{
int num = inext;
int num2 = inextp;
if (++num >= 56)
{
num = 1;
}
if (++num2 >= 56)
{
num2 = 1;
}
int num3 = SeedArray[num] - SeedArray[num2];
if (num3 == 2147483647)
{
num3--;
}
if (num3 < 0)
{
num3 += 2147483647;
}
SeedArray[num] = num3;
inext = num;
inextp = num2;
return num3;
}
public virtual int Next()
{
return InternalSample();
}
private double GetSampleForLargeRange()
{
int num = InternalSample();
bool flag = InternalSample() % 2 == 0;
if (flag)
{
num = -num;
}
double num2 = num;
num2 += 2147483646.0;
return num2 / 4294967293.0;
}
public virtual int Next(int minValue, int maxValue)
{
if (minValue > maxValue)
{
throw new ArgumentOutOfRangeException("minValue", "minValue must be less than maxValue.");
}
long num = maxValue - (long)minValue;
if (num <= 2147483647L)
{
return (int)(Sample() * num) + minValue;
}
return (int)((long)(GetSampleForLargeRange() * num) + minValue);
}
public virtual int Next(int maxValue)
{
if (maxValue < 0)
{
throw new ArgumentOutOfRangeException("maxValue", "maxValue must be positive.");
}
return (int)(Sample() * maxValue);
}
public virtual double NextDouble()
{
return Sample();
}
public virtual void NextBytes(byte[] buffer)
{
if (buffer == null)
{
throw new ArgumentNullException("buffer");
}
for (int i = 0; i < buffer.Length; i++)
{
buffer[i] = (byte)(InternalSample() % 256);
}
}
}
}