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); }
/// <summary> /// Gets a date around a semester'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); }
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)); }
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); }
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)); } } }
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); }