[TOC]
using System;
using CenterSpace.NMath.Core;
namespace CenterSpace.NMath.Core.Examples.CSharp
{
/// <summary>
/// A .NET example in C# showing how to generate random numbers from a stream.
/// </summary>
class VectorizedRNGExample
{
static void Main(string[] args)
{
// Unlike scalar-type generators whose output is a successive random number, vector
// generators produce a vector of n successive random numbers from a given
// distribution. Vector type random number generators will generally perform
// better than scalar ones because overhead expense of a function call
// is comparable to the total time required for computation.
// A stream is constructed from an optional seed, and an optional enumerated value specifying which
// algorithm to use for generating random numbers uniformly dstributed in the interval [0, 1].
int seed = 0x345;
RandomNumberStream stream = new RandomNumberStream(seed, RandomNumberStream.BasicRandGenType.MersenneTwister);
// NMath provides distribution classes for many continuous and discrete distributions, each with
// their own distribution parameters.
double mean = 1.0;
double sigma = 1.0;
DoubleRandomGaussianDistribution dist = new DoubleRandomGaussianDistribution(mean, sigma);
// You can use a stream and distribution to fill an array.
int n = 100;
int start = 0;
double[] a = new double[n];
dist.Fill(stream, a, start, n);
// Or to fill a new vector or matrix.
stream.Reset(seed);
DoubleVector v = new DoubleVector(n, stream, dist);
// Display a histogram.
int numbins = 10;
Histogram hist = new Histogram(numbins, v);
Console.WriteLine(hist);
// If you want the performance of a vectorized random number generator, but still need to access the
// random deviates sequentially, NMath provides class RandomNumbers, which uses a stream to
// buffer the random numbers internally.
int bufferSize = 100;
RandomNumbers<double, DoubleRandomGaussianDistribution> rnd =
new RandomNumbers<double, DoubleRandomGaussianDistribution>(seed, dist, bufferSize);
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Next() = {0}", (double)rnd.Next());
}
Console.WriteLine();
Console.WriteLine("Press Enter Key");
Console.Read();
}
} // class
} // namespace
[TOC]