public static MaritalStatus RandomMaritalStatus(DateTime?dob, Gender gender) { if (Etx.MyRand.NextDouble() <= AmericanData.PERCENT_UNMARRIED_WHOLE_LIFE) { return(MaritalStatus.Single); } dob = dob ?? Etx.RandomAdultBirthDate(); var avgAgeMarriage = gender == Gender.Female ? AmericanEquations.FemaleAge2FirstMarriage.SolveForY(dob.Value.ToDouble()) : AmericanEquations.MaleAge2FirstMarriage.SolveForY(dob.Value.ToDouble()); var cdt = DateTime.UtcNow; var currentAge = Etc.CalcAge(dob.Value, cdt); if (currentAge < avgAgeMarriage) { return(MaritalStatus.Single); } //chance for being widowed goes up exp for older if (Etx.MyRand.NextDouble() <= AmericanEquations.Age2ProbWidowed.SolveForY(currentAge)) { return(MaritalStatus.Widowed); } //young first marriage if (!(currentAge > avgAgeMarriage + AmericanData.AVG_LENGTH_OF_MARRIAGE)) { return(MaritalStatus.Married); } //spin for divorce var df = Etx.MyRand.NextDouble() <= AmericanData.PERCENT_DIVORCED; //have 'separated' (whatever it means) as low probability if (df && currentAge < avgAgeMarriage + AmericanData.AVG_LENGTH_OF_MARRIAGE + AmericanData.YEARS_BEFORE_NEXT_MARRIAGE) { return(Etx.RandomRollBelowOrAt(64, Etx.Dice.OneThousand) ? MaritalStatus.Separated : MaritalStatus.Divorced); } //have prob of never remarry if (df && gender == Gender.Male) { return(Etx.MyRand.NextDouble() <= AmericanData.PERCENT_OF_MEN_MARRIED_ONCE_NEVER_AGAIN ? MaritalStatus.Divorced : MaritalStatus.Remarried); } if (df && gender == Gender.Female) { return(Etx.MyRand.NextDouble() <= AmericanData.PERCENT_OF_WOMEN_MARRIED_ONCE_NEVER_AGAIN ? MaritalStatus.Divorced : MaritalStatus.Remarried); } return(df ? MaritalStatus.Remarried : MaritalStatus.Married); }
public static DateTime?RandomChildBirthDate(DateTime motherDob, int numberOfSiblings, DateTime?atTime = null) { //put number of siblings in scope for equations if (numberOfSiblings <= 0) { numberOfSiblings = 0; } if (numberOfSiblings > 4) { numberOfSiblings = 3; } //default atTime to now var dt = atTime ?? DateTime.UtcNow; var motherAge = Etc.CalcAge(motherDob, dt); var meanAge = AmericanEquations.FemaleAge2FirstChild.SolveForY(motherDob.Year); //mother is too young for children if (motherAge < meanAge) { return(null); } switch (numberOfSiblings) { case 2: meanAge = AmericanEquations.FemaleAge2SecondChild.SolveForY(motherDob.Year); if (motherAge < meanAge) { return(null); } break; case 3: meanAge = AmericanEquations.FemaleAge2ThirdChild.SolveForY(motherDob.Year); if (motherAge < meanAge) { return(null); } break; case 4: meanAge = AmericanEquations.FemaleAge2ForthChild.SolveForY(motherDob.Year); if (motherAge < meanAge) { return(null); } break; } return(Etx.RandomDate((int)Math.Round(meanAge), motherDob)); }
public static DateTime?RandomMarriageDate(DateTime?dob, Gender myGender) { dob = dob ?? Etx.RandomAdultBirthDate(); var dt = DateTime.UtcNow; var avgAgeMarriage = myGender == Gender.Female ? AmericanEquations.FemaleAge2FirstMarriage.SolveForY(dob.Value.ToDouble()) : AmericanEquations.MaleAge2FirstMarriage.SolveForY(dob.Value.ToDouble()); var currentAge = Etc.CalcAge(dob.Value, dt); //all other MaritalStatus imply at least one marriage in past var yearsMarried = currentAge - Convert.ToInt32(Math.Round(avgAgeMarriage)); var marriedOn = Etx.RandomDate(-1 * yearsMarried, dt); //zero-out the time marriedOn = new DateTime(marriedOn.Year, marriedOn.Month, marriedOn.Day); return(marriedOn); }
public static int RandomNumberOfChildren(DateTime?dob, DateTime?atDateTime = null) { //average to be 2.5 var vt = DateTime.UtcNow; if (atDateTime != null) { vt = atDateTime.Value; } dob = dob ?? Etx.RandomAdultBirthDate(); var age = Etc.CalcAge(dob.Value, vt); var randV = Etx.RandomInteger(1, 100); var meanAge = Math.Round(AmericanEquations.FemaleAge2ForthChild.SolveForY(vt.Year)); if (randV >= 84 && age >= meanAge) { return(4); } meanAge = Math.Round(AmericanEquations.FemaleAge2ThirdChild.SolveForY(vt.Year)); if (randV >= 66 && age >= meanAge) { return(3); } meanAge = Math.Round(AmericanEquations.FemaleAge2SecondChild.SolveForY(vt.Year)); if (randV >= 33 && age >= meanAge) { return(2); } meanAge = Math.Round(AmericanEquations.FemaleAge2FirstChild.SolveForY(vt.Year)); return(age >= meanAge ? 1 : 0); }
public static AmericanEducation RandomEducation(DateTime?birthDate = null, string homeState = null, string zipCode = null) { var edu = new AmericanEducation(); var dob = birthDate ?? Etx.RandomAdultBirthDate(); var age = Etc.CalcAge(dob); if (age < DF_MIN_AGE_ENTER_HS) { return(edu); } var dtAtAge18 = dob.AddYears(UsState.AGE_OF_ADULT); var isLegalAdult = age >= UsState.AGE_OF_ADULT; if (!edu.AssignRandomHighSchool(homeState, zipCode, isLegalAdult, dtAtAge18, out var hsGradDt)) { return(edu); } var usstate = UsState.GetState(homeState); edu.AssignRandomCollege(usstate?.ToString(), hsGradDt); return(edu); }
public int GetAge() { return(Etc.CalcAge(DateOfBirth)); }