public static char RandomBraille(ulong seed, int dots) { string s = BrailleByDots[dots % 9]; return(s[RNG.DetermineBounded(seed, s.Length)]); }
public void TestDetermineBounded() { ulong[] states = { 0UL, ulong.MinValue, ulong.MaxValue, ulong.MaxValue / 2 }; int[] boundaries = { int.MaxValue, int.MinValue, 0, 1, -1, 2, -2, int.MaxValue / 2, int.MinValue / 2 }; foreach (ulong state in states) { for (ulong adding = 0; adding <= 300; adding += 3) { foreach (int bound in boundaries) { int value = RNG.DetermineBounded(state + adding, bound); Assert.AreEqual(value, RNG.DetermineBounded(state + adding, bound)); switch (bound) { case 0: Assert.AreEqual(0, value); break; case { } _ when bound > 0: Assert.IsTrue(value >= 0, $"Boundary fail with value {value} and bound {bound}"); Assert.IsTrue(value < bound, $"Boundary fail with value {value} and bound {bound}"); break; case { } _ when bound < 0: Assert.IsTrue(value <= 0, $"Boundary fail with value {value} and bound {bound}"); Assert.IsTrue(value > bound, $"Boundary fail with value {value} and bound {bound}"); break; default: Assert.Fail($"Untested value: {bound}"); break; } } int sum = 0; for (ulong i = 0; i < 1000; i++) { sum += RNG.DetermineBounded(state + adding + i, -2); } Assert.IsTrue(sum <-375 && sum> -625, $"Sum of 1000 calls to DetermineBounded(-2): {sum}"); } } }