Example #1
0
        public static void CDFSampling()
        {
            var cdfSampleTestCount = 2000000;
            var pdfSizes           = new[] { 5, 10, 25, 50, 100, 250 };

            var rnd = new RandomSystem(0);

            foreach (var pz in pdfSizes)
            {
                var pdf = new double[pz].SetByIndex(i => rnd.UniformDouble());
                var sum = pdf.Sum();

                var cdf = new DistributionFunction(pdf);
                Assert.True(cdf.Norm.ApproximateEquals(sum, 1e-10));

                rnd.ReSeed(0);
                var sc1 = new int[pdf.Length];
                Report.BeginTimed("Sample Binary Search");
                for (int i = 0; i < cdfSampleTestCount; i++)
                {
                    var ind = cdf.Sample(rnd.UniformDouble());
                    sc1[ind]++;
                }
                Report.End();

                rnd.ReSeed(0);
                var sc2 = new int[pdf.Length];
                Report.BeginTimed("Sample Linear Search");
                for (int i = 0; i < cdfSampleTestCount; i++)
                {
                    var ind = SamplePDFLinear(pdf, sum, rnd.UniformDouble());
                    sc2[ind]++;
                }
                Report.End();

                for (int i = 0; i < pdf.Length; i++)
                {
                    Assert.True(sc1[i] == sc2[i]);
                }
            }
        }