Пример #1
0
        public void TestNormalDistGetZScore()
        {
            var testSubject = new NormalDistEquation {
                Mean = 0, StdDev = 1
            };

            var testResult = testSubject.GetZScoreFor(0);

            Assert.IsTrue(testResult >= 0.499);

            testResult = testSubject.GetZScoreFor(1);
            Assert.IsTrue(testResult >= 0.34134);
        }
Пример #2
0
        /// <summary>
        /// Gets a date around a semester&apos;s end moving
        /// out (x) number of years, at random, from <see cref="fromHere"/>
        /// </summary>
        /// <param name="fromHere"></param>
        /// <param name="eq">Normal dist which determines (x) mentioned above.</param>
        /// <param name="monthOfMayOnly">Force the random date to occur only in the month of May</param>
        /// <returns></returns>
        public static DateTime GetRandomGraduationDate(DateTime fromHere, NormalDistEquation eq, bool monthOfMayOnly = false)
        {
            var years = Etx.RandomValueInNormalDist(eq);

            var gradDt      = fromHere.AddYears((int)Math.Round(years));
            var validMonths = monthOfMayOnly ? new[] { 5 } : new[] { 5, 12 };

            while (!validMonths.Contains(gradDt.Month))
            {
                gradDt = gradDt.AddMonths(1);
            }
            gradDt = new DateTime(gradDt.Year, gradDt.Month, Etx.RandomInteger(12, 28));
            return(gradDt);
        }
Пример #3
0
        public void TestGetRandomGraduationDate()
        {
            var normDist = new NormalDistEquation {
                Mean = 4.469, StdDev = 0.5145
            };
            var atDate = DateTime.Today;

            var minYears   = (int)Math.Floor(4.469 - 0.5145 * 3);
            var testResult = AmericanEducation.GetRandomGraduationDate(atDate, normDist);

            System.Diagnostics.Debug.WriteLine(testResult);
            Assert.IsTrue(DateTime.Today.AddYears(minYears * -1) < testResult);
            Assert.IsTrue(new[] { 5, 12 }.Contains(testResult.Month));
        }
Пример #4
0
        public static IEnumerable <double> RandomValuesFromAverage(double mean = 0.0D, int count = 128)
        {
            //get some random number of items
            var matchSign = mean < 0 ? -1D : 1;

            count = count <= 1 ? RandomInteger(2, 128) : count;
            mean  = Math.Abs(mean);
            var stdDev     = mean * 0.125D;
            var normalDist = new NormalDistEquation {
                Mean = mean, StdDev = stdDev
            };
            var randList = new List <double>();

            for (var i = 0; i < count; i++)
            {
                randList.Add(RandomValueInNormalDist(normalDist) * matchSign);
            }

            return(randList);
        }
Пример #5
0
        public void TestNormalDist()
        {
            var testSubject = new NormalDistEquation()
            {
                Mean = 0, StdDev = 1
            };

            Console.WriteLine(string.Format("{0}\t{1}", "x", "f(x)"));
            for (var i = 0; i <= 30; i++)
            {
                for (var j = 0; j < 10; j++)
                {
                    var z          = i * 0.1 + j * 0.01;
                    var testResult = testSubject.SolveForY(z);
                    //var testResult = (z - testSubject.Mean)/testSubject.StdDev;
                    //System.Diagnostics.Debug.Write(string.Format(" {0} ", z));
                    Console.WriteLine(string.Format("{0}\t{1}", z, testResult));
                }
            }
        }
Пример #6
0
        public static double RandomValueInNormalDist(NormalDistEquation eq, int sigma = 3)
        {
            if (eq == null)
            {
                throw new ArgumentNullException(nameof(eq));
            }

            var minRand = eq.Mean - (eq.StdDev * sigma);
            var maxRand = eq.Mean + (eq.StdDev * sigma);

            if (minRand < Int32.MinValue || maxRand > Int32.MaxValue)
            {
                throw new ArgumentException("The random number generator is limited to int max 2^31 value.");
            }

            for (var i = 0; i < 1024; i++)
            {
                //guess some value w/i 3 std dev's
                var someValue = RandomDouble(minRand, maxRand);

                //get the probability of that guess
                var zscore = eq.GetZScoreFor(someValue);

                //zscore
                var attempt = RandomDouble(0, 5) * 0.1;

                //try getting a value with that probability
                var isGe = attempt >= zscore;

                //when succeed - return some value
                if (isGe)
                {
                    return(someValue);
                }
            }
            return(eq.Mean);
        }