public async Task TestBetaDistribution01()
        {
            using var rng = new MultiThreadedRng();
            var dist = new FastRng.Float.Distributions.BetaA2B2(rng);
            var fqa  = new Float.FrequencyAnalysis();

            for (var n = 0; n < 100_000; n++)
            {
                fqa.CountThis(await dist.NextNumber());
            }

            var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine);

            Assert.That(result[0], Is.EqualTo(0.0396f).Within(0.3f));
            Assert.That(result[1], Is.EqualTo(0.0784f).Within(0.3f));
            Assert.That(result[2], Is.EqualTo(0.1164f).Within(0.3f));

            Assert.That(result[21], Is.EqualTo(0.6864f).Within(0.3f));
            Assert.That(result[22], Is.EqualTo(0.7084f).Within(0.3f));
            Assert.That(result[23], Is.EqualTo(0.7296f).Within(0.3f));

            Assert.That(result[50], Is.EqualTo(0.9996f).Within(0.3f));

            Assert.That(result[75], Is.EqualTo(0.7296f).Within(0.3f));
            Assert.That(result[85], Is.EqualTo(0.4816f).Within(0.3f));
            Assert.That(result[90], Is.EqualTo(0.3276f).Within(0.3f));

            Assert.That(result[97], Is.EqualTo(0.0784f).Within(0.3f));
            Assert.That(result[98], Is.EqualTo(0.0396f).Within(0.3f));
            Assert.That(result[99], Is.EqualTo(0.0000f).Within(0.3f));
        }
Exemple #2
0
        public async Task TestLaplaceDistribution01()
        {
            using var rng = new MultiThreadedRng();
            var dist = new FastRng.Double.Distributions.LaplaceB01M05(rng);
            var fra  = new FrequencyAnalysis();

            for (var n = 0; n < 100_000; n++)
            {
                fra.CountThis(await dist.NextNumber());
            }

            var result = fra.NormalizeAndPlotEvents(TestContext.WriteLine);

            Assert.That(result[0], Is.EqualTo(0.0074465830709244).Within(0.004));
            Assert.That(result[1], Is.EqualTo(0.0082297470490200).Within(0.004));
            Assert.That(result[2], Is.EqualTo(0.0090952771016958).Within(0.01));

            Assert.That(result[21], Is.EqualTo(0.0608100626252180).Within(0.02));
            Assert.That(result[22], Is.EqualTo(0.0672055127397498).Within(0.02));
            Assert.That(result[23], Is.EqualTo(0.0742735782143340).Within(0.02));

            Assert.That(result[50], Is.EqualTo(1.0000000000000000).Within(0.2));

            Assert.That(result[75], Is.EqualTo(0.0742735782143335).Within(0.01));
            Assert.That(result[85], Is.EqualTo(0.0273237224472924).Within(0.01));
            Assert.That(result[90], Is.EqualTo(0.0165726754017612).Within(0.01));

            Assert.That(result[97], Is.EqualTo(0.0082297470490200).Within(0.004));
            Assert.That(result[98], Is.EqualTo(0.0074465830709243).Within(0.004));
            Assert.That(result[99], Is.EqualTo(0.0067379469990854).Within(0.004));
        }
Exemple #3
0
        public async Task TestChiSquareDistribution01()
        {
            using var rng = new MultiThreadedRng();
            var dist = new FastRng.Float.Distributions.ChiSquareK10(rng);
            var fqa  = new FrequencyAnalysis();

            for (var n = 0; n < 100_000; n++)
            {
                var value = await dist.NextNumber();

                fqa.CountThis(value);
            }

            var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine);

            Assert.That(result[0], Is.EqualTo(0.0000000164021588f).Within(0.0000002f));
            Assert.That(result[1], Is.EqualTo(0.0000002611256437f).Within(0.000003f));
            Assert.That(result[2], Is.EqualTo(0.0000013153553250f).Within(0.00002f));

            Assert.That(result[21], Is.EqualTo(0.003459320622874f).Within(0.005f));
            Assert.That(result[22], Is.EqualTo(0.004111875573379f).Within(0.005f));
            Assert.That(result[23], Is.EqualTo(0.004850674298859f).Within(0.005f));

            Assert.That(result[50], Is.EqualTo(0.086418773275056f).Within(0.05f));

            Assert.That(result[75], Is.EqualTo(0.376092741436046f).Within(0.08f));
            Assert.That(result[85], Is.EqualTo(0.586569751611096f).Within(0.08f));
            Assert.That(result[90], Is.EqualTo(0.717189736168766f).Within(0.08f));

            Assert.That(result[97], Is.EqualTo(0.931477764640217f).Within(0.08f));
            Assert.That(result[98], Is.EqualTo(0.965244855212136f).Within(0.08f));
            Assert.That(result[99], Is.EqualTo(0.999827884370044f).Within(0.08f));
        }
        public async Task TestBetaDistribution01()
        {
            using var rng = new MultiThreadedRng();
            var dist = new FastRng.Float.Distributions.BetaA5B2(rng);
            var fqa  = new FrequencyAnalysis();

            for (var n = 0; n < 100_000; n++)
            {
                fqa.CountThis(await dist.NextNumber());
            }

            var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine);

            Assert.That(result[0], Is.EqualTo(0.0000001f).Within(0.0000003f));
            Assert.That(result[1], Is.EqualTo(0.0000019f).Within(0.00001f));
            Assert.That(result[2], Is.EqualTo(0.0000096f).Within(0.0004f));

            Assert.That(result[21], Is.EqualTo(0.0222918f).Within(0.03f));
            Assert.That(result[22], Is.EqualTo(0.0262883f).Within(0.03f));
            Assert.That(result[23], Is.EqualTo(0.0307623f).Within(0.03f));

            Assert.That(result[50], Is.EqualTo(0.4044237f).Within(0.2f));

            Assert.That(result[75], Is.EqualTo(0.9768445f).Within(0.15f));
            Assert.That(result[85], Is.EqualTo(0.9552714f).Within(0.15f));
            Assert.That(result[90], Is.EqualTo(0.8004420f).Within(0.35f));

            Assert.That(result[97], Is.EqualTo(0.2250578f).Within(0.03f));
            Assert.That(result[98], Is.EqualTo(0.1171927f).Within(0.03f));
            Assert.That(result[99], Is.EqualTo(0f).Within(0.0004f));
        }
Exemple #5
0
        public async Task TestCauchyDistribution01()
        {
            // The properties of the cauchy distribution cannot be tested by mean, media or variance,
            // cf. https://en.wikipedia.org/wiki/Cauchy_distribution#Explanation_of_undefined_moments

            using var rng = new MultiThreadedRng();
            var dist = new FastRng.Float.Distributions.CauchyLorentzX0(rng);
            var fqa  = new FrequencyAnalysis();

            for (var n = 0; n < 100_000; n++)
            {
                fqa.CountThis(await dist.NextNumber());
            }

            var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine);

            Assert.That(result[0], Is.EqualTo(0.976990739772031f).Within(0.06f));
            Assert.That(result[1], Is.EqualTo(0.948808314586299f).Within(0.06f));
            Assert.That(result[2], Is.EqualTo(0.905284997403441f).Within(0.06f));

            Assert.That(result[21], Is.EqualTo(0.168965864241396f).Within(0.04f));
            Assert.That(result[22], Is.EqualTo(0.156877686354491f).Within(0.04f));
            Assert.That(result[23], Is.EqualTo(0.145970509936354f).Within(0.04f));

            Assert.That(result[50], Is.EqualTo(0.036533159835978f).Within(0.01f));

            Assert.That(result[75], Is.EqualTo(0.016793067514802f).Within(0.01f));
            Assert.That(result[85], Is.EqualTo(0.01316382933791f).Within(0.005f));
            Assert.That(result[90], Is.EqualTo(0.011773781734516f).Within(0.005f));

            Assert.That(result[97], Is.EqualTo(0.010168596941156f).Within(0.005f));
            Assert.That(result[98], Is.EqualTo(0.009966272570142f).Within(0.005f));
            Assert.That(result[99], Is.EqualTo(0.00976990739772f).Within(0.005f));
        }
        public async Task TestExponentialDistribution01()
        {
            using var rng = new MultiThreadedRng();
            var dist = new FastRng.Float.Distributions.ExponentialLa5(rng);
            var fqa  = new FrequencyAnalysis();

            for (var n = 0; n < 100_000; n++)
            {
                fqa.CountThis(await dist.NextNumber());
            }

            var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine);

            Assert.That(result[0], Is.EqualTo(1.0002177398625f).Within(0.05f));
            Assert.That(result[1], Is.EqualTo(0.951436545064811f).Within(0.05f));
            Assert.That(result[2], Is.EqualTo(0.905034437210948f).Within(0.05f));

            Assert.That(result[21], Is.EqualTo(0.35001394450853f).Within(0.05f));
            Assert.That(result[22], Is.EqualTo(0.332943563002074f).Within(0.05f));
            Assert.That(result[23], Is.EqualTo(0.31670571382568f).Within(0.05f));

            Assert.That(result[50], Is.EqualTo(0.082102871800213f).Within(0.01f));

            Assert.That(result[75], Is.EqualTo(0.023522866606758f).Within(0.01f));
            Assert.That(result[85], Is.EqualTo(0.014267339801329f).Within(0.01f));
            Assert.That(result[90], Is.EqualTo(0.011111415409621f).Within(0.01f));

            Assert.That(result[97], Is.EqualTo(0.007830082099077f).Within(0.008f));
            Assert.That(result[98], Is.EqualTo(0.007448204488898f).Within(0.008f));
            Assert.That(result[99], Is.EqualTo(0.007084951269538f).Within(0.008f));
        }
Exemple #7
0
        public async Task TestChiSquareDistribution01()
        {
            using var rng = new MultiThreadedRng();
            var dist = new FastRng.Double.Distributions.ChiSquareK4(rng);
            var fqa  = new FrequencyAnalysis();

            for (var n = 0; n < 100_000; n++)
            {
                fqa.CountThis(await dist.NextNumber());
            }

            var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine);

            Assert.That(result[0], Is.EqualTo(0.016417705906679).Within(0.02));
            Assert.That(result[1], Is.EqualTo(0.032671644513723).Within(0.02));
            Assert.That(result[2], Is.EqualTo(0.048763041010352).Within(0.02));

            Assert.That(result[21], Is.EqualTo(0.32518779111264).Within(0.05));
            Assert.That(result[22], Is.EqualTo(0.338273451612642).Within(0.05));
            Assert.That(result[23], Is.EqualTo(0.351220492939994).Within(0.05));

            Assert.That(result[50], Is.EqualTo(0.65209223303425).Within(0.08));

            Assert.That(result[75], Is.EqualTo(0.857562207152294).Within(0.099));
            Assert.That(result[85], Is.EqualTo(0.923072405412387).Within(0.099));
            Assert.That(result[90], Is.EqualTo(0.952623623874265).Within(0.099));

            Assert.That(result[97], Is.EqualTo(0.990616879396201).Within(0.099));
            Assert.That(result[98], Is.EqualTo(0.995734077068522).Within(0.099));
            Assert.That(result[99], Is.EqualTo(1.00077558852585).Within(0.1));
        }
Exemple #8
0
        public async Task TestUniformDistribution01()
        {
            const double A        = 0.0;
            const double B        = 1.0;
            const double MEAN     = 0.5 * (A + B);
            const double VARIANCE = (1.0 / 12.0) * (B - A) * (B - A);

            var stats = new RunningStatistics();
            var fra   = new FrequencyAnalysis();

            using var rng = new MultiThreadedRng();

            for (var n = 0; n < 100_000; n++)
            {
                var value = await rng.GetUniform();

                stats.Push(value);
                fra.CountThis(value);
            }

            fra.NormalizeAndPlotEvents(TestContext.WriteLine);
            fra.PlotOccurence(TestContext.WriteLine);
            TestContext.WriteLine($"mean={MEAN} vs. {stats.Mean}");
            TestContext.WriteLine($"variance={VARIANCE} vs {stats.Variance}");

            Assert.That(stats.Mean, Is.EqualTo(MEAN).Within(0.01), "Mean is out of range");
            Assert.That(stats.Variance, Is.EqualTo(VARIANCE).Within(0.001), "Variance is out of range");
        }
        public async Task TestLogNormalDistribution01()
        {
            using var rng = new MultiThreadedRng();
            var dist = new FastRng.Float.Distributions.LogNormalS1M0(rng);
            var fra  = new FrequencyAnalysis();

            for (var n = 0; n < 100_000; n++)
            {
                fra.CountThis(await dist.NextNumber());
            }

            var result = fra.NormalizeAndPlotEvents(TestContext.WriteLine);

            Assert.That(result[0], Is.EqualTo(0.001505531f).Within(0.003f));
            Assert.That(result[1], Is.EqualTo(0.014408709f).Within(0.01f));
            Assert.That(result[2], Is.EqualTo(0.043222256f).Within(0.02f));

            Assert.That(result[21], Is.EqualTo(0.876212056f).Within(0.15f));
            Assert.That(result[22], Is.EqualTo(0.895582226f).Within(0.15f));
            Assert.That(result[23], Is.EqualTo(0.912837250f).Within(0.15f));

            Assert.That(result[50], Is.EqualTo(0.948062005f).Within(0.2f));

            Assert.That(result[75], Is.EqualTo(0.768584762f).Within(0.089f));
            Assert.That(result[85], Is.EqualTo(0.697303612f).Within(0.089f));
            Assert.That(result[90], Is.EqualTo(0.663570581f).Within(0.089f));

            Assert.That(result[97], Is.EqualTo(0.618792767f).Within(0.089f));
            Assert.That(result[98], Is.EqualTo(0.612636410f).Within(0.089f));
            Assert.That(result[99], Is.EqualTo(0.606540679f).Within(0.089f));
        }
Exemple #10
0
        public async Task TestExponentialDistribution01()
        {
            using var rng = new MultiThreadedRng();
            var dist = new FastRng.Float.Distributions.ExponentialLa10(rng);
            var fqa  = new FrequencyAnalysis();

            for (var n = 0; n < 100_000; n++)
            {
                fqa.CountThis(await dist.NextNumber());
            }

            var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine);

            Assert.That(result[0], Is.EqualTo(1.00075018434777f).Within(0.05f));
            Assert.That(result[1], Is.EqualTo(0.905516212904248f).Within(0.05f));
            Assert.That(result[2], Is.EqualTo(0.81934495207398f).Within(0.05f));

            Assert.That(result[21], Is.EqualTo(0.122548293148741f).Within(0.12f));
            Assert.That(result[22], Is.EqualTo(0.110886281157421f).Within(0.12f));
            Assert.That(result[23], Is.EqualTo(0.10033405633809f).Within(0.12f));

            Assert.That(result[50], Is.EqualTo(0.00674300170146f).Within(0.005f));

            Assert.That(result[75], Is.EqualTo(0.000553499285385f).Within(0.001f));
            Assert.That(result[85], Is.EqualTo(0.000203621007796f).Within(0.001f));
            Assert.That(result[90], Is.EqualTo(0.00012350238419f).Within(0.001f));

            Assert.That(result[97], Is.EqualTo(0.0000613294689720f).Within(0.0008f));
            Assert.That(result[98], Is.EqualTo(0.0000554931983541f).Within(0.0008f));
            Assert.That(result[99], Is.EqualTo(0.0000502123223173f).Within(0.0008f));
        }
        public async Task TestNormalDistribution01()
        {
            const float MEAN = 0.5f;
            const float STANDARD_DEVIATION = 0.2f;

            using var rng = new MultiThreadedRng();
            var dist  = new FastRng.Float.Distributions.NormalS02M05(rng);
            var stats = new RunningStatistics();
            var fra   = new FrequencyAnalysis();

            for (var n = 0; n < 100_000; n++)
            {
                var nextNumber = await dist.NextNumber();

                stats.Push(nextNumber);
                fra.CountThis(nextNumber);
            }

            fra.NormalizeAndPlotEvents(TestContext.WriteLine);

            TestContext.WriteLine($"mean={MEAN} vs. {stats.Mean}");
            TestContext.WriteLine($"variance={STANDARD_DEVIATION * STANDARD_DEVIATION} vs {stats.Variance}");

            Assert.That(stats.Mean, Is.EqualTo(MEAN).Within(0.01f), "Mean is out of range");
            Assert.That(stats.Variance, Is.EqualTo(STANDARD_DEVIATION * STANDARD_DEVIATION).Within(0.01f), "Variance is out of range");
        }
        public async Task TestGammaDistribution01()
        {
            using var rng = new MultiThreadedRng();
            var dist = new FastRng.Float.Distributions.GammaA5B15(rng);
            var fra  = new FrequencyAnalysis();

            for (var n = 0; n < 100_000; n++)
            {
                fra.CountThis(await dist.NextNumber());
            }

            var result = fra.NormalizeAndPlotEvents(TestContext.WriteLine);

            Assert.That(result[0], Is.EqualTo(0.0000929594237282f).Within(0.0008f));
            Assert.That(result[1], Is.EqualTo(0.0012801746797876f).Within(0.002f));
            Assert.That(result[2], Is.EqualTo(0.0055781488254349f).Within(0.004f));

            Assert.That(result[21], Is.EqualTo(0.9331608887752720f).Within(0.09f));
            Assert.That(result[22], Is.EqualTo(0.9594734828891280f).Within(0.09f));
            Assert.That(result[23], Is.EqualTo(0.9790895765535350f).Within(0.09f));

            Assert.That(result[50], Is.EqualTo(0.3478287795336570f).Within(0.06f));

            Assert.That(result[75], Is.EqualTo(0.0403399049422936f).Within(0.009f));
            Assert.That(result[85], Is.EqualTo(0.0163628388658126f).Within(0.009f));
            Assert.That(result[90], Is.EqualTo(0.0097147611446660f).Within(0.005f));

            Assert.That(result[97], Is.EqualTo(0.0041135143233153f).Within(0.008f));
            Assert.That(result[98], Is.EqualTo(0.0036872732029996f).Within(0.008f));
            Assert.That(result[99], Is.EqualTo(0.0033038503429554f).Within(0.008f));
        }
Exemple #13
0
        public async Task TestCauchyDistribution01()
        {
            // The properties of the cauchy distribution cannot be tested by mean, media or variance,
            // cf. https://en.wikipedia.org/wiki/Cauchy_distribution#Explanation_of_undefined_moments

            using var rng = new MultiThreadedRng();
            var dist = new FastRng.Float.Distributions.CauchyLorentzX1(rng);
            var fqa  = new FrequencyAnalysis();

            for (var n = 0; n < 100_000; n++)
            {
                fqa.CountThis(await dist.NextNumber());
            }

            var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine);

            Assert.That(result[0], Is.EqualTo(0.009966272570142f).Within(0.003f));
            Assert.That(result[1], Is.EqualTo(0.010168596941156f).Within(0.004f));
            Assert.That(result[2], Is.EqualTo(0.010377123221893f).Within(0.005f));

            Assert.That(result[21], Is.EqualTo(0.015956672819692f).Within(0.005f));
            Assert.That(result[22], Is.EqualTo(0.016366904083094f).Within(0.005f));
            Assert.That(result[23], Is.EqualTo(0.016793067514802f).Within(0.005f));

            Assert.That(result[50], Is.EqualTo(0.039454644029179f).Within(0.015f));

            Assert.That(result[75], Is.EqualTo(0.145970509936354f).Within(0.03f));
            Assert.That(result[85], Is.EqualTo(0.333365083503296f).Within(0.1f));
            Assert.That(result[90], Is.EqualTo(0.545171628270584f).Within(0.1f));

            Assert.That(result[97], Is.EqualTo(0.948808314586302f).Within(0.06f));
            Assert.That(result[98], Is.EqualTo(0.976990739772032f).Within(0.03f));
            Assert.That(result[99], Is.EqualTo(0.986760647169751f).Within(0.02f));
        }
        public async Task TestInverseGammaDistribution01()
        {
            using var rng = new MultiThreadedRng();
            var dist = new FastRng.Double.Distributions.InverseGammaA3B05(rng);
            var fra  = new FrequencyAnalysis();

            for (var n = 0; n < 100_000; n++)
            {
                fra.CountThis(await dist.NextNumber());
            }

            var result = fra.NormalizeAndPlotEvents(TestContext.WriteLine);

            Assert.That(result[0], Is.EqualTo(0.0000000000000003).Within(0.0000001));
            Assert.That(result[1], Is.EqualTo(0.0000011605257228).Within(0.00001));
            Assert.That(result[2], Is.EqualTo(0.0009536970016103).Within(0.0015));

            Assert.That(result[21], Is.EqualTo(0.5880485243048120).Within(0.05));
            Assert.That(result[22], Is.EqualTo(0.5433842148912880).Within(0.05));
            Assert.That(result[23], Is.EqualTo(0.5017780549216030).Within(0.05));

            Assert.That(result[50], Is.EqualTo(0.0741442015957425).Within(0.009));

            Assert.That(result[75], Is.EqualTo(0.0207568945092484).Within(0.006));
            Assert.That(result[85], Is.EqualTo(0.0136661506653688).Within(0.006));
            Assert.That(result[90], Is.EqualTo(0.0112550619601327).Within(0.006));

            Assert.That(result[97], Is.EqualTo(0.0087026933539773).Within(0.005));
            Assert.That(result[98], Is.EqualTo(0.0083995375385004).Within(0.005));
            Assert.That(result[99], Is.EqualTo(0.0081094156379928).Within(0.005));
        }
        public async Task TestExponentialDistribution01()
        {
            using var rng = new MultiThreadedRng();
            var dist = new FastRng.Double.Distributions.InverseExponentialLa10(rng);
            var fqa = new FrequencyAnalysis();
            
            for (var n = 0; n < 100_000; n++)
                fqa.CountThis(await dist.NextNumber());
            
            var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine);

            Assert.That(result[0], Is.EqualTo(0.0000501746820562).Within(0.0003));
            Assert.That(result[1], Is.EqualTo(0.0000554515994322).Within(0.0003));
            Assert.That(result[2], Is.EqualTo(0.0000612834950532).Within(0.0003));
            
            Assert.That(result[21], Is.EqualTo(0.00040973497898).Within(0.00045));
            Assert.That(result[22], Is.EqualTo(0.000452827182887).Within(0.00050));
            Assert.That(result[23], Is.EqualTo(0.000500451433441).Within(0.00051));
            
            Assert.That(result[50], Is.EqualTo(0.007446583070924).Within(0.003));
            
            Assert.That(result[75], Is.EqualTo(0.090717953289412).Within(0.02));
            Assert.That(result[85], Is.EqualTo(0.246596963941606).Within(0.05));
            Assert.That(result[90], Is.EqualTo(0.406569659740598).Within(0.08));
            
            Assert.That(result[97], Is.EqualTo(0.81873075307798).Within(0.08));
            Assert.That(result[98], Is.EqualTo(0.904837418035957).Within(0.08));
            Assert.That(result[99], Is.EqualTo(0.999999999999999).Within(0.08));
        }
Exemple #16
0
        public async Task TestBetaDistribution01()
        {
            using var rng = new MultiThreadedRng();
            var dist = new FastRng.Float.Distributions.BetaA2B5(rng);
            var fqa  = new Float.FrequencyAnalysis();

            for (var n = 0; n < 100_000; n++)
            {
                fqa.CountThis(await dist.NextNumber());
            }

            var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine);

            Assert.That(result[0], Is.EqualTo(0.11719271f).Within(0.3f));
            Assert.That(result[1], Is.EqualTo(0.22505783f).Within(0.3f));
            Assert.That(result[2], Is.EqualTo(0.32401717f).Within(0.3f));

            Assert.That(result[21], Is.EqualTo(0.99348410f).Within(0.3f));
            Assert.That(result[22], Is.EqualTo(0.98639433f).Within(0.3f));
            Assert.That(result[23], Is.EqualTo(0.97684451f).Within(0.3f));

            Assert.That(result[50], Is.EqualTo(0.35868592f).Within(0.3f));

            Assert.That(result[75], Is.EqualTo(0.03076227f).Within(0.03f));
            Assert.That(result[85], Is.EqualTo(0.00403061f).Within(0.03f));
            Assert.That(result[90], Is.EqualTo(0.00109800f).Within(0.01f));

            Assert.That(result[97], Is.EqualTo(0.00000191f).Within(0.000003f));
            Assert.That(result[98], Is.EqualTo(0.00000012f).Within(0.0000003f));
            Assert.That(result[99], Is.EqualTo(0.00000000f).Within(0.0000003f));
        }
        public async Task NoSeed01()
        {
            using var rng1 = new MultiThreadedRng();
            using var rng2 = new MultiThreadedRng();
            using var rng3 = new MultiThreadedRng();

            var rng1Sample = new float[10];

            for (var n = 0; n < rng1Sample.Length; n++)
            {
                rng1Sample[n] = await rng1.GetUniform();
            }

            var rng2Sample = new float[10];

            for (var n = 0; n < rng2Sample.Length; n++)
            {
                rng2Sample[n] = await rng2.GetUniform();
            }

            var rng3Sample = new float[10];

            for (var n = 0; n < rng3Sample.Length; n++)
            {
                rng3Sample[n] = await rng3.GetUniform();
            }

            Assert.That(rng1Sample, Is.Not.EquivalentTo(rng2Sample));
            Assert.That(rng1Sample, Is.Not.EquivalentTo(rng3Sample));
            Assert.That(rng2Sample, Is.Not.EquivalentTo(rng3Sample));
        }
Exemple #18
0
        public async Task TestStudentTDistribution01()
        {
            using var rng = new MultiThreadedRng();
            var dist = new FastRng.Double.Distributions.StudentTNu1(rng);
            var fra  = new FrequencyAnalysis();

            for (var n = 0; n < 100_000; n++)
            {
                fra.CountThis(await dist.NextNumber());
            }

            var result = fra.NormalizeAndPlotEvents(TestContext.WriteLine);

            Assert.That(result[0], Is.EqualTo(1.000000000).Within(0.2));
            Assert.That(result[1], Is.EqualTo(0.999700120).Within(0.2));
            Assert.That(result[2], Is.EqualTo(0.999200719).Within(0.2));

            Assert.That(result[21], Is.EqualTo(0.953929798).Within(0.2));
            Assert.That(result[22], Is.EqualTo(0.949852788).Within(0.2));
            Assert.That(result[23], Is.EqualTo(0.945631619).Within(0.2));

            Assert.That(result[50], Is.EqualTo(0.793667169).Within(0.095));

            Assert.That(result[75], Is.EqualTo(0.633937627).Within(0.09));
            Assert.That(result[85], Is.EqualTo(0.574902276).Within(0.09));
            Assert.That(result[90], Is.EqualTo(0.547070729).Within(0.09));

            Assert.That(result[97], Is.EqualTo(0.510150990).Within(0.09));
            Assert.That(result[98], Is.EqualTo(0.505075501).Within(0.09));
            Assert.That(result[99], Is.EqualTo(0.500050000).Within(0.09));
        }
        public async Task TestExponentialDistribution01()
        {
            using var rng = new MultiThreadedRng();
            var dist = new FastRng.Float.Distributions.InverseExponentialLa5(rng);
            var fqa  = new FrequencyAnalysis();

            for (var n = 0; n < 100_000; n++)
            {
                fqa.CountThis(await dist.NextNumber());
            }

            var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine);

            Assert.That(result[0], Is.EqualTo(0.007083408929052f).Within(0.008f));
            Assert.That(result[1], Is.EqualTo(0.007446583070924f).Within(0.008f));
            Assert.That(result[2], Is.EqualTo(0.007828377549226f).Within(0.008f));

            Assert.That(result[21], Is.EqualTo(0.020241911445804f).Within(0.05f));
            Assert.That(result[22], Is.EqualTo(0.021279736438377f).Within(0.05f));
            Assert.That(result[23], Is.EqualTo(0.022370771856166f).Within(0.05f));

            Assert.That(result[50], Is.EqualTo(0.08629358649937f).Within(0.02f));

            Assert.That(result[75], Is.EqualTo(0.301194211912202f).Within(0.03f));
            Assert.That(result[85], Is.EqualTo(0.496585303791409f).Within(0.05f));
            Assert.That(result[90], Is.EqualTo(0.637628151621772f).Within(0.06f));

            Assert.That(result[97], Is.EqualTo(0.904837418035959f).Within(0.08f));
            Assert.That(result[98], Is.EqualTo(0.951229424500713f).Within(0.08f));
            Assert.That(result[99], Is.EqualTo(1f).Within(0.08f));
        }
Exemple #20
0
        public async Task TestWeibullDistribution01()
        {
            using var rng = new MultiThreadedRng();
            var dist = new FastRng.Float.Distributions.WeibullK05La1(rng);
            var fra  = new FrequencyAnalysis();

            for (var n = 0; n < 100_000; n++)
            {
                fra.CountThis(await dist.NextNumber());
            }

            var result = fra.NormalizeAndPlotEvents(TestContext.WriteLine);

            Assert.That(result[0], Is.EqualTo(1.000000000f).Within(0.2f));
            Assert.That(result[1], Is.EqualTo(0.678415772f).Within(0.09f));
            Assert.That(result[2], Is.EqualTo(0.536595233f).Within(0.09f));

            Assert.That(result[21], Is.EqualTo(0.147406264f).Within(0.02f));
            Assert.That(result[22], Is.EqualTo(0.142654414f).Within(0.02f));
            Assert.That(result[23], Is.EqualTo(0.138217760f).Within(0.02f));

            Assert.That(result[50], Is.EqualTo(0.075769787f).Within(0.095f));

            Assert.That(result[75], Is.EqualTo(0.053016799f).Within(0.05f));
            Assert.That(result[85], Is.EqualTo(0.047144614f).Within(0.05f));
            Assert.That(result[90], Is.EqualTo(0.044629109f).Within(0.05f));

            Assert.That(result[97], Is.EqualTo(0.041484591f).Within(0.05f));
            Assert.That(result[98], Is.EqualTo(0.041067125f).Within(0.05f));
            Assert.That(result[99], Is.EqualTo(0.040656966f).Within(0.05f));
        }
        public async Task TestChiSquareDistribution01()
        {
            using var rng = new MultiThreadedRng();
            var dist = new FastRng.Double.Distributions.ChiSquareK1(rng);
            var fqa  = new FrequencyAnalysis();

            for (var n = 0; n < 100_000; n++)
            {
                var value = await dist.NextNumber();

                fqa.CountThis(value);
            }

            var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine);

            Assert.That(result[0], Is.EqualTo(1.00032041964207).Within(0.004));
            Assert.That(result[1], Is.EqualTo(0.70380551227703).Within(0.05));
            Assert.That(result[2], Is.EqualTo(0.571788691668126).Within(0.05));

            Assert.That(result[21], Is.EqualTo(0.192011337664754).Within(0.07));
            Assert.That(result[22], Is.EqualTo(0.186854182385981).Within(0.07));
            Assert.That(result[23], Is.EqualTo(0.182007652359976).Within(0.07));

            Assert.That(result[50], Is.EqualTo(0.109088865614875).Within(0.06));

            Assert.That(result[75], Is.EqualTo(0.07886274821701).Within(0.02));
            Assert.That(result[85], Is.EqualTo(0.070520397849883).Within(0.02));
            Assert.That(result[90], Is.EqualTo(0.066863009640287).Within(0.02));

            Assert.That(result[97], Is.EqualTo(0.062214737436948).Within(0.02));
            Assert.That(result[98], Is.EqualTo(0.061590997922187).Within(0.02));
            Assert.That(result[99], Is.EqualTo(0.060976622578824).Within(0.02));
        }
Exemple #22
0
        public async Task TestLaplaceDistribution01()
        {
            using var rng = new MultiThreadedRng();
            var dist = new FastRng.Double.Distributions.LaplaceB01M0(rng);
            var fra  = new FrequencyAnalysis();

            for (var n = 0; n < 100_000; n++)
            {
                fra.CountThis(await dist.NextNumber());
            }

            var result = fra.NormalizeAndPlotEvents(TestContext.WriteLine);

            Assert.That(result[0], Is.EqualTo(1.0000000000000000).Within(0.05));
            Assert.That(result[1], Is.EqualTo(0.9048374180359590).Within(0.05));
            Assert.That(result[2], Is.EqualTo(0.8187307530779810).Within(0.05));

            Assert.That(result[21], Is.EqualTo(0.1224564282529820).Within(0.05));
            Assert.That(result[22], Is.EqualTo(0.1108031583623340).Within(0.05));
            Assert.That(result[23], Is.EqualTo(0.1002588437228040).Within(0.05));

            Assert.That(result[50], Is.EqualTo(0.0067379469990855).Within(0.003));

            Assert.That(result[75], Is.EqualTo(0.0005530843701478).Within(0.0015));
            Assert.That(result[85], Is.EqualTo(0.0002034683690106).Within(0.0015));
            Assert.That(result[90], Is.EqualTo(0.0001234098040867).Within(0.0015));

            Assert.That(result[97], Is.EqualTo(0.0000612834950532).Within(0.0002));
            Assert.That(result[98], Is.EqualTo(0.0000554515994322).Within(0.0002));
            Assert.That(result[99], Is.EqualTo(0.0000501746820562).Within(0.0002));
        }
        public async Task TestCancellation02()
        {
            var tokenSource = new CancellationTokenSource();
            var token       = tokenSource.Token;

            tokenSource.Cancel();

            using var rng2 = new MultiThreadedRng();
            Assert.That(await rng2.GetUniform(token), Is.NaN);
        }
        public async Task TestCancellation01()
        {
            var tokenSource = new CancellationTokenSource();
            var token       = tokenSource.Token;

            tokenSource.Cancel();

            using var rng2 = new MultiThreadedRng();
            var dist = new Uniform(this.rng);

            Assert.That(await dist.NextNumber(1, 100_000, token), Is.EqualTo(0));
        }
        public async Task TestStoppingProducers01()
        {
            var rng2 = new MultiThreadedRng();

            rng2.Dispose();

            var masterToken = new CancellationTokenSource(TimeSpan.FromSeconds(16)).Token;
            var wasCanceled = false;

            while (true)
            {
                var tokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(3));
                await rng2.GetUniform(tokenSource.Token);

                if (tokenSource.IsCancellationRequested)
                {
                    wasCanceled = true;
                    break;
                }

                if (masterToken.IsCancellationRequested)
                {
                    break;
                }
            }

            Assert.That(masterToken.IsCancellationRequested, Is.False, "Master token was used to stop test");
            Assert.That(wasCanceled, Is.True, "The consumer was not canceled");

            var tokenSource2 = new CancellationTokenSource(TimeSpan.FromSeconds(3));

            await new NormalS02M05(rng2).NextNumber(tokenSource2.Token);
            Assert.That(tokenSource2.IsCancellationRequested, Is.True);

            tokenSource2 = new CancellationTokenSource(TimeSpan.FromSeconds(3));
            await new NormalS02M05(rng2).NextNumber(-1f, 1f, tokenSource2.Token);
            Assert.That(tokenSource2.IsCancellationRequested, Is.True);

            tokenSource2 = new CancellationTokenSource(TimeSpan.FromSeconds(3));
            await new NormalS02M05(rng2).NextNumber(0u, 6u, tokenSource2.Token);
            Assert.That(tokenSource2.IsCancellationRequested, Is.True);

            tokenSource2 = new CancellationTokenSource(TimeSpan.FromSeconds(3));
            await new NormalS02M05(rng2).NextNumber(0ul, 6ul, tokenSource2.Token);
            Assert.That(tokenSource2.IsCancellationRequested, Is.True);
        }
Exemple #26
0
        public async Task TwoSeeds01()
        {
            using var rng1 = new MultiThreadedRng(3, 6);
            using var rng2 = new MultiThreadedRng(3, 6);
            using var rng3 = new MultiThreadedRng(3, 7);
            using var rng4 = new MultiThreadedRng(6, 3);

            var rng1Sample = new double[10];

            for (var n = 0; n < rng1Sample.Length; n++)
            {
                rng1Sample[n] = await rng1.GetUniform();
            }

            var rng2Sample = new double[10];

            for (var n = 0; n < rng2Sample.Length; n++)
            {
                rng2Sample[n] = await rng2.GetUniform();
            }

            var rng3Sample = new double[10];

            for (var n = 0; n < rng3Sample.Length; n++)
            {
                rng3Sample[n] = await rng3.GetUniform();
            }

            var rng4Sample = new double[10];

            for (var n = 0; n < rng4Sample.Length; n++)
            {
                rng4Sample[n] = await rng4.GetUniform();
            }

            Assert.That(rng1Sample, Is.EquivalentTo(rng2Sample));
            Assert.That(rng1Sample, Is.Not.EquivalentTo(rng3Sample));
            Assert.That(rng1Sample, Is.Not.EquivalentTo(rng4Sample));
            Assert.That(rng2Sample, Is.Not.EquivalentTo(rng3Sample));
            Assert.That(rng2Sample, Is.Not.EquivalentTo(rng4Sample));
            Assert.That(rng3Sample, Is.Not.EquivalentTo(rng4Sample));
        }
        public async Task DecisionWeibull01()
        {
            using var rng = new MultiThreadedRng();
            var dist = new FastRng.Float.Distributions.WeibullK05La1(rng);

            var neededCoinTossesA = 0;
            var neededCoinTossesB = 0;
            var neededCoinTossesC = 0;

            for (var n = 0; n < 100; n++)
            {
                while (!await dist.HasDecisionBeenMade(0.0f, 0.1f))
                {
                    neededCoinTossesA++;
                }
            }
            for (var n = 0; n < 100; n++)
            {
                while (!await dist.HasDecisionBeenMade(0.5f, 0.6f))
                {
                    neededCoinTossesB++;
                }
            }
            for (var n = 0; n < 100; n++)
            {
                while (!await dist.HasDecisionBeenMade(0.8f, 0.9f))
                {
                    neededCoinTossesC++;
                }
            }

            var values = new[] { neededCoinTossesA, neededCoinTossesB, neededCoinTossesC };
            var max    = values.Max();
            var min    = values.Min();

            TestContext.WriteLine($"Coin tosses: a={neededCoinTossesA}, b={neededCoinTossesB}, c={neededCoinTossesC}");
            Assert.That(max - min, Is.LessThanOrEqualTo(2_800));
        }
Exemple #28
0
 public async Task TestBetaGeneratorWithRange01()
 {
     using var rng = new MultiThreadedRng();
     var samples = new float[1_000];
Exemple #29
0
 public async Task TestStudentTGeneratorWithRange01()
 {
     using var rng = new MultiThreadedRng();
     var dist    = new FastRng.Double.Distributions.StudentTNu1(rng);
     var samples = new double[1_000];
 public async Task TestExponentialGeneratorWithRange01()
 {
     using var rng = new MultiThreadedRng();
     var dist    = new FastRng.Float.Distributions.InverseExponentialLa5(rng);
     var samples = new float[1_000];