public Citizen(City city, long seed) { if (city == null) throw new ArgumentNullException(nameof(city)); _city = city; _seed = seed; _rng = new RNG(RNG.GetRaw(CITIZEN_RNG_BASE_GEN, seed)); var sdata = city.Rant.DoPackaged("sz/citizen", _seed); FirstName = String.Intern(sdata["firstname"]); MiddleName = String.Intern(sdata["middlename"]); MiddleInitial = MiddleName.FirstOrDefault(Char.IsLetter); LastName = String.Intern(sdata["lastname"]); Enum.TryParse(sdata["sex"], true, out _sex); // Tilt the distribution towards younger people var age = _rng.Next(18, _rng.Next(30, _rng.Next(30, 100))); var birthMonth = _rng.Next(12) + 1; var birthDay = _rng.Next(DateTime.DaysInMonth(city.StartingTime.Year - age, birthMonth)) + 1; BirthDate = new DateTime(city.StartingTime.Year - age, birthMonth, birthDay, 0, 0, 0); }
public VehicleCompany(City city, long seed) : base(city, seed, CompanySpecialization.Vehicles) { var rng = new RNG(RNG.GetRaw(Bases.Company, seed)); int numVehicleModels = rng.Next(city.Config.NumCarCompaniesMin, city.Config.NumCarCompaniesMax + 1); }
public static char SelectFromRanges(string rangeString, RNG rng) { if (String.IsNullOrEmpty(rangeString)) { return('?'); } var list = new List <Tuple <char, char, int> >(); // <min, max, weight> var chars = rangeString.GetEnumerator(); char a, b; bool stall = false; while (stall || chars.MoveNext()) { stall = false; if (Char.IsWhiteSpace(chars.Current)) { continue; } if (!Char.IsLetterOrDigit(a = chars.Current)) { return('?'); } if (!chars.MoveNext()) { list.Add(Tuple.Create(a, a, 1)); break; } if (chars.Current == '-') { if (!chars.MoveNext()) { return('?'); } if (!Char.IsLetterOrDigit(b = chars.Current)) { return('?'); } if (Char.IsLetter(a) != Char.IsLetter(b) || Char.IsUpper(a) != Char.IsUpper(b)) { return('?'); } list.Add(Tuple.Create(a <b?a : b, a> b ? a : b, Math.Abs(b - a) + 1)); continue; } list.Add(Tuple.Create(a, a, 1)); stall = true; } if (!list.Any()) { return('?'); } int wSelect = rng.Next(0, list.Sum(r => r.Item3)) + 1; var ranges = list.GetEnumerator(); while (ranges.MoveNext()) { if (wSelect > ranges.Current.Item3) { wSelect -= ranges.Current.Item3; } else { break; } } return(Convert.ToChar(rng.Next(ranges.Current.Item1, ranges.Current.Item2 + 1))); }