Improve Random interface

This commit is contained in:
Andrew Cooper
2022-03-07 22:03:45 +11:00
parent 8165f7a161
commit 5aaf703bf4
3 changed files with 96 additions and 63 deletions

View File

@@ -2,6 +2,7 @@ using System;
namespace Games.Common.Randomness;
/// <inheritdoc />
public class RandomNumberGenerator : IRandom
{
private Random _random;
@@ -13,38 +14,9 @@ public class RandomNumberGenerator : IRandom
_random = new Random((int)(DateTime.UtcNow.Ticks / TimeSpan.TicksPerSecond));
}
public float NextFloat() => NextFloat(1);
public float NextFloat(float exclusiveMaximum)
{
if (exclusiveMaximum <= 0)
{
throw new ArgumentOutOfRangeException(nameof(exclusiveMaximum), "Must be greater than 0.");
}
return NextFloat(0, exclusiveMaximum);
}
public float NextFloat(float inclusiveMinimum, float exclusiveMaximum)
{
if (exclusiveMaximum <= inclusiveMinimum)
{
throw new ArgumentOutOfRangeException(nameof(exclusiveMaximum), "Must be greater than inclusiveMinimum.");
}
var range = exclusiveMaximum - inclusiveMinimum;
return _previous = ((float)_random.NextDouble()) * range + inclusiveMinimum;
}
public int Next(int exclusiveMaximum) => ToInt(NextFloat(exclusiveMaximum));
public int Next(int inclusiveMinimum, int exclusiveMaximum) => ToInt(NextFloat(inclusiveMinimum, exclusiveMaximum));
public float NextFloat() => _previous = (float)_random.NextDouble();
public float PreviousFloat() => _previous;
public int Previous() => ToInt(_previous);
private static int ToInt(float value) => (int)Math.Floor(value);
public void Reseed(int seed) => _random = new Random(seed);
}
}