public void TestStatistics()
        {
            Simulation.NumberOfSamples = 100000;

            var distr = new ContinuousUniformDistribution(1, 12345);

            Assert.AreEqual(Statistics.Mean(distr.GetResult()), distr.Mean);
            Assert.AreEqual(Statistics.Median(distr.GetResult()), distr.Median);
            Assert.AreEqual(Statistics.StandardDeviation(distr.GetResult()), distr.StandardDeviation);
            Assert.AreEqual(Statistics.Variance(distr.GetResult()), distr.Variance);
            Assert.AreEqual(Statistics.Minimum(distr.GetResult()), distr.Minimum);
            Assert.AreEqual(Statistics.Maximum(distr.GetResult()), distr.Maximum);
            Assert.AreEqual(Statistics.Percentile(distr.GetResult(), 0), distr.Percentile(0));
            Assert.AreEqual(Statistics.Percentile(distr.GetResult(), 5), distr.Percentile(5));
            Assert.AreEqual(Statistics.Percentile(distr.GetResult(), 50), distr.Percentile(50));
            Assert.AreEqual(Statistics.Percentile(distr.GetResult(), 95), distr.Percentile(95));
            Assert.AreEqual(Statistics.Percentile(distr.GetResult(), 100), distr.Percentile(100));

            var histogram = new Histogram(distr.GetResult(), 100);

            for (int i = 0; i < histogram.BucketCount; i++)
            {
                Assert.AreEqual(histogram[i].LowerBound, distr.Histogram[i].LowerBound);
                Assert.AreEqual(histogram[i].UpperBound, distr.Histogram[i].UpperBound);
            }
        }
        public void Distribution_Resample()
        {
            Simulation.NumberOfSamples = 100000;

            var testInfo = ExpectedResults.Data["DistributionResults"]["ContinuousUniformDistribution"];
            var inputs   = testInfo["ConstructorInputs"];

            ContinuousUniformDistribution distr = new ContinuousUniformDistribution(
                inputs["min"].Value <double>(),
                inputs["max"].Value <double>(),
                inputs["randomSeed"].Value <int>());

            var resampledDist = distr.Resample();

            Assert.AreEqual(distr.Maximum, resampledDist.Maximum);
            Assert.AreEqual(distr.Minimum, resampledDist.Minimum);
            Assert.AreEqual(distr.Mean, resampledDist.Mean, 10);
            Assert.AreEqual(distr.Median, resampledDist.Median);
            Assert.AreEqual(distr.StandardDeviation, resampledDist.StandardDeviation, 10);
            Assert.AreEqual(distr.Variance, resampledDist.Variance, 10);

            Assert.AreEqual(distr.ConstrainedToInt, resampledDist.ConstrainedToInt);

            Assert.IsTrue(
                distr.GetResult()[0] != resampledDist.GetResult()[0] ||
                distr.GetResult()[1] != resampledDist.GetResult()[1] ||
                distr.GetResult()[2] != resampledDist.GetResult()[2] ||
                distr.GetResult()[3] != resampledDist.GetResult()[3] ||
                distr.GetResult()[4] != resampledDist.GetResult()[4]);

            Assert.AreEqual(distr.Percentile(0), resampledDist.Percentile(0));
            Assert.AreEqual(distr.Percentile(25), resampledDist.Percentile(25));
            Assert.AreEqual(distr.Percentile(50), resampledDist.Percentile(50));
            Assert.AreEqual(distr.Percentile(75), resampledDist.Percentile(75));
            Assert.AreEqual(distr.Percentile(100), resampledDist.Percentile(100));

            // Force recalculation by changing seed on original distribution
            distr.RandomSeed = distr.RandomSeed + 1;
            Assert.AreEqual(distr.Maximum, resampledDist.Maximum);
            Assert.AreEqual(distr.Minimum, resampledDist.Minimum);
            Assert.AreEqual(distr.Mean, resampledDist.Mean, 10);
            Assert.AreEqual(distr.Median, resampledDist.Median);
            Assert.AreEqual(distr.StandardDeviation, resampledDist.StandardDeviation, 10);
            Assert.AreEqual(distr.Variance, resampledDist.Variance, 10);
        }