diff --git a/src/Numerics/Random/CryptoRandomSource.cs b/src/Numerics/Random/CryptoRandomSource.cs index cb6614fb..0f068ac8 100644 --- a/src/Numerics/Random/CryptoRandomSource.cs +++ b/src/Numerics/Random/CryptoRandomSource.cs @@ -84,6 +84,14 @@ namespace MathNet.Numerics.Random _crypto = rng; } + /// + /// Fills the elements of a specified array of bytes with random numbers in full range, including zero and 255 (). + /// + protected override void DoSampleBytes(byte[] buffer) + { + _crypto.GetBytes(buffer); + } + /// /// Returns a random double-precision floating point number greater than or equal to 0.0, and less than 1.0. /// diff --git a/src/Numerics/Random/RandomSource.cs b/src/Numerics/Random/RandomSource.cs index 1bc80c3b..a1648748 100644 --- a/src/Numerics/Random/RandomSource.cs +++ b/src/Numerics/Random/RandomSource.cs @@ -339,7 +339,7 @@ namespace MathNet.Numerics.Random /// /// An array of bytes to contain random numbers. /// is null. - public override void NextBytes(byte[] buffer) + public sealed override void NextBytes(byte[] buffer) { if (buffer == null) { @@ -350,19 +350,13 @@ namespace MathNet.Numerics.Random { lock (_lock) { - for (var i = 0; i < buffer.Length; i++) - { - buffer[i] = (byte)(DoSampleInteger()%256); - } + DoSampleBytes(buffer); } return; } - for (var i = 0; i < buffer.Length; i++) - { - buffer[i] = (byte)(DoSampleInteger()%256); - } + DoSampleBytes(buffer); } /// @@ -388,7 +382,7 @@ namespace MathNet.Numerics.Random protected abstract double DoSample(); /// - /// Returns a random 32-bit signed integer greater than or equal to zero and less than . + /// Returns a random 32-bit signed integer greater than or equal to zero and less than 2147483647 (). /// protected virtual int DoSampleInteger() { @@ -404,5 +398,16 @@ namespace MathNet.Numerics.Random { return (int)(DoSample()*(maxExclusive - minInclusive)) + minInclusive; } + + /// + /// Fills the elements of a specified array of bytes with random numbers in full range, including zero and 255 (). + /// + protected virtual void DoSampleBytes(byte[] buffer) + { + for (var i = 0; i < buffer.Length; i++) + { + buffer[i] = (byte)(DoSampleInteger() % 256); + } + } } } diff --git a/src/Numerics/Random/SystemRandomSource.cs b/src/Numerics/Random/SystemRandomSource.cs index 4428a2c5..272f3c07 100644 --- a/src/Numerics/Random/SystemRandomSource.cs +++ b/src/Numerics/Random/SystemRandomSource.cs @@ -136,6 +136,11 @@ namespace MathNet.Numerics.Random return _random.Next(minInclusive, maxExclusive); } + protected override void DoSampleBytes(byte[] buffer) + { + _random.NextBytes(buffer); + } + /// /// Fill an array with uniform random numbers greater than or equal to 0.0 and less than 1.0. /// WARNING: potentially very short random sequence length, can generate repeated partial sequences.