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.