diff --git a/src/Numerics/Numerics.csproj b/src/Numerics/Numerics.csproj
index 77ecedee..02f0e614 100644
--- a/src/Numerics/Numerics.csproj
+++ b/src/Numerics/Numerics.csproj
@@ -96,6 +96,7 @@
True
Resources.resx
+
diff --git a/src/Numerics/Sampling/Sample.Random.cs b/src/Numerics/Sampling/Sample.Random.cs
new file mode 100644
index 00000000..1f6f754e
--- /dev/null
+++ b/src/Numerics/Sampling/Sample.Random.cs
@@ -0,0 +1,164 @@
+//
+// Math.NET Numerics, part of the Math.NET Project
+// http://mathnet.opensourcedotnet.info
+//
+// Copyright (c) 2009 Math.NET
+//
+// Permission is hereby granted, free of charge, to any person
+// obtaining a copy of this software and associated documentation
+// files (the "Software"), to deal in the Software without
+// restriction, including without limitation the rights to use,
+// copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following
+// conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+//
+
+namespace MathNet.Numerics.Sampling
+{
+ using System;
+ using Distributions;
+
+ ///
+ /// Generic Function Sampling and Quantization Provider
+ ///
+ public static partial class Sample
+ {
+ ///
+ /// Samples a function randomly with the provided distribution.
+ ///
+ /// The real-domain function to sample.
+ /// Random distribution of the real domain sample points.
+ /// The number of samples to generate.
+ /// The value type of the function to sample.
+ /// The generated sample vector.
+ ///
+ ///
+ public static T[] Random(
+ Func function,
+ IContinuousDistribution distribution,
+ int sampleCount)
+ {
+ if (ReferenceEquals(function, null))
+ {
+ throw new ArgumentNullException("function");
+ }
+
+ if (ReferenceEquals(distribution, null))
+ {
+ throw new ArgumentNullException("distribution");
+ }
+
+ if (sampleCount < 0)
+ {
+ throw new ArgumentOutOfRangeException("sampleCount");
+ }
+
+ var samples = new T[sampleCount];
+
+ for (int i = 0; i < samples.Length; i++)
+ {
+ samples[i] = function(distribution.Sample());
+ }
+
+ return samples;
+ }
+
+ ///
+ /// Samples a function randomly with the provided distribution.
+ ///
+ /// The real-domain function to sample.
+ /// Random distribution of the real domain sample points.
+ /// The number of samples to generate.
+ /// The real domain points where the samples are taken at.
+ /// The value type of the function to sample.
+ /// The generated sample vector.
+ ///
+ ///
+ public static T[] Random(
+ Func function,
+ IContinuousDistribution distribution,
+ int sampleCount,
+ out double[] samplePoints)
+ {
+ if (ReferenceEquals(function, null))
+ {
+ throw new ArgumentNullException("function");
+ }
+
+ if (ReferenceEquals(distribution, null))
+ {
+ throw new ArgumentNullException("distribution");
+ }
+
+ if (sampleCount < 0)
+ {
+ throw new ArgumentOutOfRangeException("sampleCount");
+ }
+
+ var samples = new T[sampleCount];
+ samplePoints = new double[sampleCount];
+
+ for (int i = 0; i < samples.Length; i++)
+ {
+ double current = distribution.Sample();
+ samplePoints[i] = current;
+ samples[i] = function(current);
+ }
+
+ return samples;
+ }
+
+ ///
+ /// Samples a two-domain function randomly with the provided distribution.
+ ///
+ /// The real-domain function to sample.
+ /// Random distribution of the real domain sample points.
+ /// The number of samples to generate.
+ /// The value type of the function to sample.
+ /// The generated sample vector.
+ ///
+ ///
+ public static T[] Random(
+ Func function,
+ IContinuousDistribution distribution,
+ int sampleCount)
+ {
+ if (ReferenceEquals(function, null))
+ {
+ throw new ArgumentNullException("function");
+ }
+
+ if (ReferenceEquals(distribution, null))
+ {
+ throw new ArgumentNullException("distribution");
+ }
+
+ if (sampleCount < 0)
+ {
+ throw new ArgumentOutOfRangeException("sampleCount");
+ }
+
+ var samples = new T[sampleCount];
+
+ for (int i = 0; i < samples.Length; i++)
+ {
+ samples[i] = function(distribution.Sample(), distribution.Sample());
+ }
+
+ return samples;
+ }
+ }
+}
\ No newline at end of file