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]); } } }