Refactored to use distributions

This commit is contained in:
tsommer committed 2020-09-26 00:05:41 +02:00
1 parent 90804bdf2b
commit bc68dd0971
2 files changed
+184 -96

No files matched your search

+64 -42
View File
@@ -3,6 +3,7 @@ using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Threading.Tasks;
using FastRng;
using FastRng.Distributions;
using NUnit.Framework;
namespace FastRngTests
@@ -17,8 +18,9 @@ namespace FastRngTests
[Category(TestCategories.NORMAL)]
public async Task TestRange01Uint()
{
var dist = new Uniform();
for (uint n = 0; n < 1_000_000; n++)
Assert.That(await rng.NextNumber(n, 100_000 + n), Is.InRange(n, 100_000 + n));
Assert.That(await rng.NextNumber(n, 100_000 + n, dist), Is.InRange(n, 100_000 + n));
}
[Test]
@@ -26,8 +28,9 @@ namespace FastRngTests
[Category(TestCategories.NORMAL)]
public async Task TestRange01Ulong()
{
var dist = new Uniform();
for (ulong n = 0; n < 1_000_000; n++)
Assert.That(await rng.NextNumber(n, 100_000 + n), Is.InRange(n, 100_000 + n));
Assert.That(await rng.NextNumber(n, 100_000 + n, dist), Is.InRange(n, 100_000 + n));
}
[Test]
@@ -35,8 +38,9 @@ namespace FastRngTests
[Category(TestCategories.NORMAL)]
public async Task TestRange01Float()
{
var dist = new Uniform();
for (var n = 0f; n < 1e6f; n++)
Assert.That(await rng.NextNumber(n, 100_000 + n), Is.InRange(n, 100_000 + n));
Assert.That(await rng.NextNumber(n, 100_000 + n, dist), Is.InRange(n, 100_000 + n));
}
[Test]
@@ -44,9 +48,10 @@ namespace FastRngTests
[Category(TestCategories.NORMAL)]
public async Task TestRange02Uint()
{
Assert.That(await rng.NextNumber(5, 5), Is.EqualTo(5));
Assert.That(await rng.NextNumber(0, 0), Is.EqualTo(0));
Assert.That(await rng.NextNumber(3_000_000_000, 3_000_000_000), Is.EqualTo(3_000_000_000));
var dist = new Uniform();
Assert.That(await rng.NextNumber(5, 5, dist), Is.EqualTo(5));
Assert.That(await rng.NextNumber(0, 0, dist), Is.EqualTo(0));
Assert.That(await rng.NextNumber(3_000_000_000, 3_000_000_000, dist), Is.EqualTo(3_000_000_000));
}
[Test]
@@ -54,9 +59,10 @@ namespace FastRngTests
[Category(TestCategories.NORMAL)]
public async Task TestRange02Ulong()
{
Assert.That(await rng.NextNumber(5UL, 5), Is.EqualTo(5));
Assert.That(await rng.NextNumber(0UL, 0), Is.EqualTo(0));
Assert.That(await rng.NextNumber(3_000_000_000UL, 3_000_000_000), Is.EqualTo(3_000_000_000));
var dist = new Uniform();
Assert.That(await rng.NextNumber(5UL, 5, dist), Is.EqualTo(5));
Assert.That(await rng.NextNumber(0UL, 0, dist), Is.EqualTo(0));
Assert.That(await rng.NextNumber(3_000_000_000UL, 3_000_000_000, dist), Is.EqualTo(3_000_000_000));
}
[Test]
@@ -64,9 +70,10 @@ namespace FastRngTests
[Category(TestCategories.NORMAL)]
public async Task TestRange02Float()
{
Assert.That(await rng.NextNumber(5f, 5f), Is.EqualTo(5));
Assert.That(await rng.NextNumber(0f, 0f), Is.EqualTo(0));
Assert.That(await rng.NextNumber(3e9f, 3e9f), Is.EqualTo(3e9f));
var dist = new Uniform();
Assert.That(await rng.NextNumber(5f, 5f, dist), Is.EqualTo(5));
Assert.That(await rng.NextNumber(0f, 0f, dist), Is.EqualTo(0));
Assert.That(await rng.NextNumber(3e9f, 3e9f, dist), Is.EqualTo(3e9f));
}
[Test]
@@ -74,9 +81,10 @@ namespace FastRngTests
[Category(TestCategories.NORMAL)]
public async Task TestRange03Uint()
{
Assert.That(await rng.NextNumber(5, 6), Is.InRange(5, 6));
Assert.That(await rng.NextNumber(0, 1), Is.InRange(0, 1));
Assert.That(await rng.NextNumber(3_000_000_000, 3_000_000_002), Is.InRange(3_000_000_000, 3_000_000_002));
var dist = new Uniform();
Assert.That(await rng.NextNumber(5, 6, dist), Is.InRange(5, 6));
Assert.That(await rng.NextNumber(0, 1, dist), Is.InRange(0, 1));
Assert.That(await rng.NextNumber(3_000_000_000, 3_000_000_002, dist), Is.InRange(3_000_000_000, 3_000_000_002));
}
[Test]
@@ -84,9 +92,10 @@ namespace FastRngTests
[Category(TestCategories.NORMAL)]
public async Task TestRange03Ulong()
{
Assert.That(await rng.NextNumber(5UL, 6), Is.InRange(5, 6));
Assert.That(await rng.NextNumber(0UL, 1), Is.InRange(0, 1));
Assert.That(await rng.NextNumber(3_000_000_000UL, 3_000_000_002), Is.InRange(3_000_000_000, 3_000_000_002));
var dist = new Uniform();
Assert.That(await rng.NextNumber(5UL, 6, dist), Is.InRange(5, 6));
Assert.That(await rng.NextNumber(0UL, 1, dist), Is.InRange(0, 1));
Assert.That(await rng.NextNumber(3_000_000_000UL, 3_000_000_002, dist), Is.InRange(3_000_000_000, 3_000_000_002));
}
[Test]
@@ -94,9 +103,10 @@ namespace FastRngTests
[Category(TestCategories.NORMAL)]
public async Task TestRange03Float()
{
Assert.That(await rng.NextNumber(5f, 6), Is.InRange(5, 6));
Assert.That(await rng.NextNumber(0f, 1), Is.InRange(0, 1));
Assert.That(await rng.NextNumber(3e9f, 3e9f+2), Is.InRange(3e9f, 3e9f+2));
var dist = new Uniform();
Assert.That(await rng.NextNumber(5f, 6, dist), Is.InRange(5, 6));
Assert.That(await rng.NextNumber(0f, 1, dist), Is.InRange(0, 1));
Assert.That(await rng.NextNumber(3e9f, 3e9f+2, dist), Is.InRange(3e9f, 3e9f+2));
}
[Test]
@@ -104,8 +114,9 @@ namespace FastRngTests
[Category(TestCategories.NORMAL)]
public async Task TestRange04Uint()
{
Assert.That(await rng.NextNumber(10, 1), Is.InRange(1, 10));
Assert.That(await rng.NextNumber(20, 1), Is.InRange(1, 20));
var dist = new Uniform();
Assert.That(await rng.NextNumber(10, 1, dist), Is.InRange(1, 10));
Assert.That(await rng.NextNumber(20, 1, dist), Is.InRange(1, 20));
}
[Test]
@@ -113,8 +124,9 @@ namespace FastRngTests
[Category(TestCategories.NORMAL)]
public async Task TestRange04Ulong()
{
Assert.That(await rng.NextNumber(10UL, 1), Is.InRange(1, 10));
Assert.That(await rng.NextNumber(20UL, 1), Is.InRange(1, 20));
var dist = new Uniform();
Assert.That(await rng.NextNumber(10UL, 1, dist), Is.InRange(1, 10));
Assert.That(await rng.NextNumber(20UL, 1, dist), Is.InRange(1, 20));
}
[Test]
@@ -122,8 +134,9 @@ namespace FastRngTests
[Category(TestCategories.NORMAL)]
public async Task TestRange04Float()
{
Assert.That(await rng.NextNumber(10f, 1), Is.InRange(1, 10));
Assert.That(await rng.NextNumber(20f, 1), Is.InRange(1, 20));
var dist = new Uniform();
Assert.That(await rng.NextNumber(10f, 1, dist), Is.InRange(1, 10));
Assert.That(await rng.NextNumber(20f, 1, dist), Is.InRange(1, 20));
}
[Test]
@@ -131,10 +144,11 @@ namespace FastRngTests
[Category(TestCategories.NORMAL)]
public async Task TestRange05Uint()
{
var dist = new Uniform();
var distribution = new uint[101];
var runs = 1_000_000;
for (var n = 0; n < runs; n++)
distribution[await rng.NextNumber(0, 100)]++;
distribution[await rng.NextNumber(0, 100, dist)]++;
for (var n = 0; n < distribution.Length - 1; n++)
Assert.That(distribution[n], Is.GreaterThan(0));
@@ -145,10 +159,11 @@ namespace FastRngTests
[Category(TestCategories.NORMAL)]
public async Task TestRange05Ulong()
{
var dist = new Uniform();
var distribution = new uint[101];
var runs = 1_000_000;
for (var n = 0; n < runs; n++)
distribution[await rng.NextNumber(0UL, 100)]++;
distribution[await rng.NextNumber(0UL, 100, dist)]++;
for (var n = 0; n < distribution.Length - 1; n++)
Assert.That(distribution[n], Is.GreaterThan(0));
@@ -159,10 +174,11 @@ namespace FastRngTests
[Category(TestCategories.NORMAL)]
public async Task TestRange05Float()
{
var dist = new Uniform();
var distribution = new uint[101];
var runs = 1_000_000;
for (var n = 0; n < runs; n++)
distribution[(uint)MathF.Floor(await rng.NextNumber(0f, 100f))]++;
distribution[(uint)MathF.Floor(await rng.NextNumber(0f, 100f, dist))]++;
for (var n = 0; n < distribution.Length - 1; n++)
Assert.That(distribution[n], Is.GreaterThan(0));
@@ -172,72 +188,78 @@ namespace FastRngTests
[Category(TestCategories.NORMAL)]
public async Task TestDistribution001Uint()
{
var dist = new Uniform();
var distribution = new uint[101];
var runs = 1_000_000;
for (var n = 0; n < runs; n++)
distribution[await rng.NextNumber(0, 100)]++;
distribution[await rng.NextNumber(0, 100, dist)]++;
Assert.That(distribution[..100].Max() - distribution[..100].Min(), Is.InRange(0, 600));
Assert.That(distribution[..^1].Max() - distribution[..^1].Min(), Is.InRange(0, 600));
}
[Test]
[Category(TestCategories.NORMAL)]
public async Task TestDistribution001Ulong()
{
var dist = new Uniform();
var distribution = new uint[101];
var runs = 1_000_000;
for (var n = 0; n < runs; n++)
distribution[await rng.NextNumber(0UL, 100)]++;
distribution[await rng.NextNumber(0UL, 100, dist)]++;
Assert.That(distribution[..100].Max() - distribution[..100].Min(), Is.InRange(0, 600));
Assert.That(distribution[..^1].Max() - distribution[..^1].Min(), Is.InRange(0, 600));
}
[Test]
[Category(TestCategories.NORMAL)]
public async Task TestDistribution001Float()
{
var dist = new Uniform();
var distribution = new uint[101];
var runs = 1_000_000;
for (var n = 0; n < runs; n++)
distribution[(uint)MathF.Floor(await rng.NextNumber(0f, 100f))]++;
distribution[(uint)MathF.Floor(await rng.NextNumber(0f, 100f, dist))]++;
Assert.That(distribution[..100].Max() - distribution[..100].Min(), Is.InRange(0, 600));
Assert.That(distribution[..^1].Max() - distribution[..^1].Min(), Is.InRange(0, 600));
}
[Test]
[Category(TestCategories.LONG_RUNNING)]
public async Task TestDistribution002Uint()
{
var dist = new Uniform();
var distribution = new uint[101];
var runs = 100_000_000;
for (var n = 0; n < runs; n++)
distribution[await rng.NextNumber(0, 100)]++;
distribution[await rng.NextNumber(0, 100, dist)]++;
Assert.That(distribution[..100].Max() - distribution[..100].Min(), Is.InRange(0, 600));
Assert.That(distribution[..^1].Max() - distribution[..^1].Min(), Is.InRange(0, 6_000));
}
[Test]
[Category(TestCategories.LONG_RUNNING)]
public async Task TestDistribution002Ulong()
{
var dist = new Uniform();
var distribution = new uint[101];
var runs = 100_000_000;
for (var n = 0; n < runs; n++)
distribution[await rng.NextNumber(0UL, 100)]++;
distribution[await rng.NextNumber(0UL, 100, dist)]++;
Assert.That(distribution[..100].Max() - distribution[..100].Min(), Is.InRange(0, 600));
Assert.That(distribution[..^1].Max() - distribution[..^1].Min(), Is.InRange(0, 6_000));
}
[Test]
[Category(TestCategories.LONG_RUNNING)]
public async Task TestDistribution002Float()
{
var dist = new Uniform();
var distribution = new uint[101];
var runs = 100_000_000;
for (var n = 0; n < runs; n++)
distribution[(uint)MathF.Floor(await rng.NextNumber(0f, 100f))]++;
distribution[(uint)MathF.Floor(await rng.NextNumber(0f, 100f, dist))]++;
Assert.That(distribution[..100].Max() - distribution[..100].Min(), Is.InRange(0, 600));
Assert.That(distribution[..^1].Max() - distribution[..^1].Min(), Is.InRange(0, 6_000));
}
}
}