public void GenerateTest()
        {
            double[] transProbRow = { 0.2, 0.5, 0.3 };
            var gdd = new GeneralDiscreteDistribution(transProbRow);
            int n = 100000;
            {
                int[] samples = gdd.Generate(n);
                var target = new GeneralDiscreteDistribution(3);
                target.Fit(samples);
                Assert.AreEqual(0.2, target.Frequencies[0], 0.01);
                Assert.AreEqual(0.5, target.Frequencies[1], 0.01);
                Assert.AreEqual(0.3, target.Frequencies[2], 0.01);
            }

            {
                int[] samples = new int[n].Apply((x) => gdd.Generate());
                var target = new GeneralDiscreteDistribution(3);
                target.Fit(samples);
                Assert.AreEqual(0.2, target.Frequencies[0], 0.01);
                Assert.AreEqual(0.5, target.Frequencies[1], 0.01);
                Assert.AreEqual(0.3, target.Frequencies[2], 0.01);
            }

            {
                double[] samples = gdd.Generate(n).ToDouble();
                var target = new GeneralDiscreteDistribution(3);
                target.Fit(samples);
                Assert.AreEqual(0.2, target.Frequencies[0], 0.01);
                Assert.AreEqual(0.5, target.Frequencies[1], 0.01);
                Assert.AreEqual(0.3, target.Frequencies[2], 0.01);
            }

            {
                double[] samples = new int[n].Apply((x) => (double)gdd.Generate());
                var target = new GeneralDiscreteDistribution(3);
                target.Fit(samples);
                Assert.AreEqual(0.2, target.Frequencies[0], 0.01);
                Assert.AreEqual(0.5, target.Frequencies[1], 0.01);
                Assert.AreEqual(0.3, target.Frequencies[2], 0.01);
            }
        }