Skip to content

Commit 0db646b

Browse files
Alinshanssunnycase
authored andcommitted
Improve rng algorithm. (#56)
1 parent 4cce768 commit 0db646b

File tree

2 files changed

+51
-7
lines changed

2 files changed

+51
-7
lines changed

src/MineCase.Algorithm/UniformRNG.cs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@ public struct UniformRNG
1212
private static readonly ulong _increment = 1442695040888963407;
1313

1414
private ulong _state;
15+
private uint _count;
1516

1617
public UniformRNG(ulong state)
1718
{
19+
_count = 101;
1820
if (state == 0)
1921
{
2022
var time = DateTime.Now;
@@ -97,10 +99,21 @@ public double Uniform(double a, double b)
9799

98100
private uint Next()
99101
{
100-
_state ^= _state >> 13;
101-
_state ^= (_state << 7) | 0x9d2c5680;
102-
_state ^= (_state << 15) & 0xefc67a5b;
103-
_state = _state * _multiplier + _increment;
102+
--_count;
103+
if (_count == 0)
104+
{
105+
for (int i = 0; i < 4; ++i)
106+
{
107+
_state = _state * _multiplier + _increment;
108+
}
109+
110+
_count = 101;
111+
}
112+
113+
_state ^= _state >> 21;
114+
_state ^= (_state << 13) | 0x73a4b9de9d2c5680;
115+
_state ^= (_state << 29) & 0x5b3e6da7efc67a5b;
116+
_state ^= _state >> 33;
104117
return (uint)_state;
105118
}
106119
}

tests/UnitTest/RNGTest.cs

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using ImageSharp;
77
using MineCase.Algorithm;
88
using Xunit;
9+
using System.Diagnostics;
910

1011
namespace MineCase.UnitTest
1112
{
@@ -79,7 +80,7 @@ public void TestFrequencyImg()
7980
}
8081

8182
[Fact]
82-
public void TesIntNoiseImg()
83+
public void TestIntNoiseImg()
8384
{
8485
var rng = new UniformRNG(0);
8586

@@ -103,7 +104,7 @@ public void TesIntNoiseImg()
103104
}
104105

105106
[Fact]
106-
public void TesFloatNoiseImg()
107+
public void TestFloatNoiseImg()
107108
{
108109
var rng = new UniformRNG(0);
109110

@@ -127,7 +128,7 @@ public void TesFloatNoiseImg()
127128
}
128129

129130
[Fact]
130-
public void TesDoubleNoiseImg()
131+
public void TestDoubleNoiseImg()
131132
{
132133
var rng = new UniformRNG(0);
133134

@@ -149,5 +150,35 @@ public void TesDoubleNoiseImg()
149150
image.SaveAsBmp(file);
150151
}
151152
}
153+
154+
[Fact]
155+
public void TestRNGPerformance()
156+
{
157+
var rng = new UniformRNG(0);
158+
var random = new Random();
159+
Stopwatch sw = new Stopwatch();
160+
161+
sw.Start();
162+
int res = 0;
163+
for (int i = 0; i < 10000000; ++i)
164+
{
165+
res += rng.NextInt32();
166+
}
167+
168+
sw.Stop();
169+
var t1 = sw.ElapsedMilliseconds;
170+
171+
sw.Start();
172+
res = 0;
173+
for (int i = 0; i < 10000000; ++i)
174+
{
175+
res += random.Next();
176+
}
177+
178+
sw.Stop();
179+
var t2 = sw.ElapsedMilliseconds;
180+
181+
Assert.True(t1 < t2);
182+
}
152183
}
153184
}

0 commit comments

Comments
 (0)