我正在寻找一个很好的算法,最好使用CLR的DateTime
类型和其他内置东西,而不仅仅是使用金属数学,来猜测给定年龄的生日。根据年龄生成一个随机生日
该日期应该是现实的,而不仅仅是1月1日。我需要他们来测试一个应用程序,其中包含生日数字的数字通过Luhn校验码进行验证。
我到目前为止是从现在开始减去年龄,给我一个最低日期。然后我可以随机添加年,月和日。然而,后一个过程在获得错误的随机月份或日期方面可能会改变日期的最终年龄。
我正在寻找一个很好的算法,最好使用CLR的DateTime
类型和其他内置东西,而不仅仅是使用金属数学,来猜测给定年龄的生日。根据年龄生成一个随机生日
该日期应该是现实的,而不仅仅是1月1日。我需要他们来测试一个应用程序,其中包含生日数字的数字通过Luhn校验码进行验证。
我到目前为止是从现在开始减去年龄,给我一个最低日期。然后我可以随机添加年,月和日。然而,后一个过程在获得错误的随机月份或日期方面可能会改变日期的最终年龄。
快速和肮脏的解决方案,发现使用Ticks
min
和max
之间的日期:
var min = DateTime.Parse("1988/02/10");
var max = DateTime.Parse("2016/01/05");
var minTicks = min.Ticks;
var maxTicks = max.Ticks;
var baseTicks = maxTicks-minTicks;
var rnd = new Random();
var toAdd = (long)(rnd.NextDouble()*baseTicks);
var newDate = new DateTime(minTicks+toAdd);
当然,如果你需要多个日期,你可以将它们添加到列表中:
public static List<DateTime> GetBirthdaysBetweenDates(DateTime minDate, DateTime maxDate, int number = 1)
{
if(minDate > maxDate) throw new ArgumentException("minDate can't be greater then maxDate");
var dates = new List<DateTime>();
if(number <= 0) return dates;
var rnd = new Random();
var ticks = maxDate.Ticks - minDate.Ticks;
for(var i = 0; i < number; i++)
{
var toAdd = (long)(rnd.NextDouble() * ticks);
dates.Add(new DateTime(minDate.Ticks + toAdd));
}
return dates;
}
使用蜱得分为1分。我自己也在思考类似的问题。 – ProfK
你可以尝试这样的事情:
//define lowest and highest days here
DateTime dateFrom = new DateTime(2017, 1, 1);
DateTime dateTo = new DateTime(2018, 1, 1);
//calculate number of days
int daysRange = dateTo.Subtract(dateFrom).Days;
//list to hold generated birthdays
List<DateTime> birthdays = new List<DateTime>();
//randomizer
Random rand = new Random();
//number of birthdays to generate
int number = 10;
for (int i = 0; i<number; i++)
{
//genrate number between 0 and daysRange and add that many days to dateFrom
DateTime newDate = dateFrom.AddDays(rand.Next(daysRange));
//add to list
birthdays.Add(newDate);
}
你可以发表进来的代码?你有什么尝试? – Kyle
请说明*“guessing”*的含义。此外,您应该向问题中添加您已经尝试的内容,并且了解您需要哪些输入以及您期望的输出会很有用。 –
@Kyle我会的,但是我在工作中问过这个问题,而且我只有在家的源代码。 – ProfK