From aa4aa9d158507b5c945409d28af5841161a0e640 Mon Sep 17 00:00:00 2001 From: Christoph Ruegg Date: Thu, 18 Aug 2016 12:28:53 +0200 Subject: [PATCH] Random: explicit byte sampling implementation for MersenneTwister and XorShift --- src/Numerics/Random/MersenneTwister.cs | 11 +++++++++++ src/Numerics/Random/Xorshift.cs | 18 +++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/Numerics/Random/MersenneTwister.cs b/src/Numerics/Random/MersenneTwister.cs index bd8fed69..6cce7d08 100644 --- a/src/Numerics/Random/MersenneTwister.cs +++ b/src/Numerics/Random/MersenneTwister.cs @@ -341,6 +341,17 @@ namespace MathNet.Numerics.Random return int31; } + /// + /// Fills the elements of a specified array of bytes with random numbers in full range, including zero and 255 (). + /// + protected sealed override void DoSampleBytes(byte[] buffer) + { + for (var i = 0; i < buffer.Length; i++) + { + buffer[i] = (byte)(genrand_int32() % 256); + } + } + /* /// /// Generates a random number on [0,1) with 53-bit resolution. /// diff --git a/src/Numerics/Random/Xorshift.cs b/src/Numerics/Random/Xorshift.cs index 61f0e949..1c64226f 100644 --- a/src/Numerics/Random/Xorshift.cs +++ b/src/Numerics/Random/Xorshift.cs @@ -266,7 +266,7 @@ namespace MathNet.Numerics.Random /// /// Returns a random 32-bit signed integer greater than or equal to zero and less than /// - protected override int DoSampleInteger() + protected sealed override int DoSampleInteger() { var t = (_a * _x) + _c; _x = _y; @@ -283,6 +283,22 @@ namespace MathNet.Numerics.Random return int31; } + /// + /// Fills the elements of a specified array of bytes with random numbers in full range, including zero and 255 (). + /// + protected sealed override void DoSampleBytes(byte[] buffer) + { + for (var i = 0; i < buffer.Length; i++) + { + var t = (_a * _x) + _c; + _x = _y; + _y = _z; + _c = t >> 32; + _z = t & 0xffffffff; + buffer[i] = (byte)(_z % 256); + } + } + /// /// Fills an array with random numbers greater than or equal to 0.0 and less than 1.0. ///