예제 #1
0
        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);
        }
예제 #2
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);
 }
예제 #3
0
        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)));
        }