Discrete Distributions in C# QuickStart Sample

Illustrates how to use the classes that represent discrete probability distributions in the Extreme.Statistics.Distributions namespace in C#.

View this sample in: Visual Basic F# IronPython

using System;

using Extreme.Mathematics.Random;
using Extreme.Statistics;
using Extreme.Statistics.Distributions;

namespace Extreme.Numerics.Quickstart.CSharp
{
    /// <summary>
    /// Demonstrates how to use classes that implement
    /// discrete probabililty distributions.
    /// </summary>
    class DiscreteDistributions
    {
        static void Main(string[] args)
        {
            // The license is verified at runtime. We're using
            // a demo license here. For more information, see
            // https://numerics.net/trial-key
            Extreme.License.Verify("Demo license");

            // This QuickStart Sample demonstrates the capabilities of
            // the classes that implement discrete probability distributions.
            // These classes inherit from the DiscreteDistribution class.
            //
            // For an illustration of classes that implement discrete probability
            // distributions, see the ContinuousDistributions QuickStart Sample.
            // 
            // We illustrate the properties and methods of discrete distribution
            // using a binomial distribution. The same properties and methods
            // apply to all other discrete distributions.

            // 
            // Constructing distributions
            //

            // Many discrete probability distributions are related to Bernoulli trials,
            // events with a certain probability, p, of success. The number of trials
            // is often one of the distribution's parameters.

            // The binomial distribution has two constructors. Here, we create a
            // binomial distribution for 6 trials with a probability of success of 0.6:
            BinomialDistribution binomial = new BinomialDistribution(6, 0.6);

            // The distribution's parameters are available through the
            // NumberOfTrials and ProbabilityOfSuccess properties:
            Console.WriteLine("# of trials:          {0:F5}", binomial.NumberOfTrials);
            Console.WriteLine("Prob. of success:     {0:F5}", binomial.ProbabilityOfSuccess);


            //
            // Basic statistics
            //

            // The Mean property returns the mean of the distribution:
            Console.WriteLine("Mean:                 {0:F5}", binomial.Mean);

            // The Variance and StandardDeviation are also available:
            Console.WriteLine("Variance:             {0:F5}", binomial.Variance);
            Console.WriteLine("Standard deviation:   {0:F5}", binomial.StandardDeviation);

            // As are the skewness:
            Console.WriteLine("Skewness:             {0:F5}", binomial.Skewness);

            // The Kurtosis property returns the kurtosis supplement.
            // The Kurtosis property for the normal distribution returns zero.
            Console.WriteLine("Kurtosis:             {0:F5}", binomial.Kurtosis);
            Console.WriteLine();


            //
            // Distribution functions
            //

            // The (cumulative) distribution function (CDF) is implemented by the
            // DistributionFunction method:
            Console.WriteLine("CDF(4) =            {0:F5}", binomial.DistributionFunction(4));

            // The probability density function (PDF) is available as the 
            // Probability method:
            Console.WriteLine("PDF(4) =            {0:F5}", binomial.Probability(4));
            
            // The Probability method has an overload that returns the probability
            // that a variate lies between two values:
            Console.WriteLine("Probability(3, 5) = {0:F5}", binomial.Probability(3, 5));
            Console.WriteLine();

            //
            // Random variates
            //

            // The Sample method returns a single random variate 
            // using the specified random number generator:
            System.Random rng = new MersenneTwister();
            int x = binomial.Sample(rng);
            // The Sample method fills an array or vector with
            // random variates. It has several overloads:
            int[] xArray = new int[100];
            // 1. Fill all values:
            binomial.Sample(rng, xArray);
            // 2. Fill only a range (start index and length are supplied)
            binomial.Sample(rng, xArray, 20, 50);

            // The GetExpectedHistogram method returns a Histogram that contains the
            // expected number of samples in each bin:
            var h = binomial.GetExpectedHistogram(100);
            Console.WriteLine("Expected distribution of 100 samples:");
            Console.WriteLine(h.Summarize());
            Console.WriteLine();

            Console.Write("Press any key to exit.");
            Console.ReadLine();
        }
    }
}