diff --git a/src/Numerics/Random/RandomSource.cs b/src/Numerics/Random/RandomSource.cs index a3ca0deb..ef776014 100644 --- a/src/Numerics/Random/RandomSource.cs +++ b/src/Numerics/Random/RandomSource.cs @@ -472,6 +472,12 @@ namespace MathNet.Numerics.Random /// protected virtual long DoSampleInt64WithNBits(int bitCount) { + // Fast case: Only 0 is allowed to be returned + // No random call is needed + if (bitCount == 0) + { + return 0; + } var bytes = new byte[8]; DoSampleBytes(bytes); @@ -489,6 +495,13 @@ namespace MathNet.Numerics.Random /// The exclusive upper bound of the random number returned. protected virtual int DoSampleInteger(int maxExclusive) { + // Fast case: Only a single number is allowed to be returned + // No random call is needed + if (maxExclusive == 1) + { + return 0; + } + // non-biased implementation // (biased: return (int)(DoSample() * maxExclusive);) diff --git a/src/UnitTests/Random/RandomTests.cs b/src/UnitTests/Random/RandomTests.cs index 408ff02d..2e1d5ab5 100644 --- a/src/UnitTests/Random/RandomTests.cs +++ b/src/UnitTests/Random/RandomTests.cs @@ -78,6 +78,29 @@ namespace MathNet.Numerics.UnitTests.Random Assert.IsTrue(sum >= (N/2.0) - (.05*N)); Assert.IsTrue(sum <= (N/2.0) + (.05*N)); + var disposable = random as IDisposable; + if (disposable != null) + { + disposable.Dispose(); + } + } + + /// + /// Next() result is in boundaries. + /// + [Test] + public void Boundaries() + { + var random = (System.Random)Activator.CreateInstance(_randomType, new object[] { false }); + + for (var i = 1; i < N; i++) + { + var j = N; + var next = random.Next(i, j); + Assert.IsTrue(next >= i, string.Format("Value {0} is smaller than lower bound {1}", next, i)); + Assert.IsTrue(next < j, string.Format("Value {0} is larger or equal to upper bound {1}", next, j)); + } + var disposable = random as IDisposable; if (disposable != null) {