diff --git a/MLEM/Misc/SingleRandom.cs b/MLEM/Misc/SingleRandom.cs
index c662a5f..ee1bb15 100644
--- a/MLEM/Misc/SingleRandom.cs
+++ b/MLEM/Misc/SingleRandom.cs
@@ -3,7 +3,7 @@
namespace MLEM.Misc {
///
/// The SingleRandom class allows generating single, one-off pseudorandom numbers based on a seed, or a set of seeds.
- /// The types of numbers that can be generated are and , the former of which can be generated with specific minimum and maximum values.
+ /// The types of numbers that can be generated are and , both of which can be generated with specific minimum and maximum values if desired.
/// Methods in this class are tested to be sufficiently "random", that is, to be sufficiently distributed throughout their range, as well as sufficiently different for neighboring seeds.
///
public class SingleRandom {
@@ -94,6 +94,52 @@ namespace MLEM.Misc {
return (SingleRandom.Scramble(seeds) / (float) int.MaxValue + 1) / 2;
}
+ ///
+ /// Generates a single, one-off pseudorandom floating point number between 0 and based on a given .
+ /// This method is guaranteed to return the same result for the same .
+ ///
+ /// The (exclusive) maximum value.
+ /// The seed to use.
+ /// The generated number.
+ public static float Single(int maxValue, int seed) {
+ return maxValue * SingleRandom.Single(seed);
+ }
+
+ ///
+ /// Generates a single, one-off pseudorandom floating point number between 0 and based on a given set of .
+ /// This method is guaranteed to return the same result for the same set of .
+ ///
+ /// The (exclusive) maximum value.
+ /// The seeds to use.
+ /// The generated number.
+ public static float Single(int maxValue, params int[] seeds) {
+ return maxValue * SingleRandom.Single(seeds);
+ }
+
+ ///
+ /// Generates a single, one-off pseudorandom floating point number between and based on a given .
+ /// This method is guaranteed to return the same result for the same .
+ ///
+ /// The (inclusive) minimum value.
+ /// The (exclusive) maximum value.
+ /// The seed to use.
+ /// The generated number.
+ public static float Single(int minValue, int maxValue, int seed) {
+ return (maxValue - minValue) * SingleRandom.Single(seed) + minValue;
+ }
+
+ ///
+ /// Generates a single, one-off pseudorandom floating point number between and based on a given set of .
+ /// This method is guaranteed to return the same result for the same set of .
+ ///
+ /// The (inclusive) minimum value.
+ /// The (exclusive) maximum value.
+ /// The seeds to use.
+ /// The generated number.
+ public static float Single(int minValue, int maxValue, params int[] seeds) {
+ return (maxValue - minValue) * SingleRandom.Single(seeds) + minValue;
+ }
+
private static int Scramble(int[] seeds) {
if (seeds == null || seeds.Length <= 0)
throw new ArgumentOutOfRangeException(nameof(seeds));
diff --git a/Tests/SingleRandomTests.cs b/Tests/SingleRandomTests.cs
index b02955a..5795886 100644
--- a/Tests/SingleRandomTests.cs
+++ b/Tests/SingleRandomTests.cs
@@ -16,6 +16,8 @@ public class SingleRandomTests {
// test if all methods that accept mins and max are identical
Assert.AreEqual(SingleRandom.Int(i), SingleRandom.Int(int.MaxValue, i));
Assert.AreEqual(SingleRandom.Int(i), SingleRandom.Int(0, int.MaxValue, i));
+ Assert.AreEqual(SingleRandom.Single(i), SingleRandom.Single(1, i));
+ Assert.AreEqual(SingleRandom.Single(i), SingleRandom.Single(0, 1, i));
}
}
@@ -23,6 +25,9 @@ public class SingleRandomTests {
public void TestBounds() {
for (var i = 0; i < 1000000; i++) {
Assert.That(SingleRandom.Single(i), Is.LessThan(1).And.GreaterThanOrEqualTo(0));
+ Assert.That(SingleRandom.Single(127, i), Is.LessThan(127).And.GreaterThanOrEqualTo(0));
+ Assert.That(SingleRandom.Single(12920, 1203919023, i), Is.LessThan(1203919023).And.GreaterThanOrEqualTo(12920));
+
Assert.That(SingleRandom.Int(i), Is.LessThan(int.MaxValue).And.GreaterThanOrEqualTo(0));
Assert.That(SingleRandom.Int(17, i), Is.LessThan(17).And.GreaterThanOrEqualTo(0));
Assert.That(SingleRandom.Int(19283, 832498394, i), Is.LessThan(832498394).And.GreaterThanOrEqualTo(19283));