给定年龄

时间:2017-06-05 14:08:32

标签: c# algorithm datetime random

我正在寻找一个好的算法,最好是使用CLR的DateTime类型和其他内置的东西,而不仅仅是使用金属数学,来猜测生日日期给定年龄。

日期应该是现实的,而不仅仅是1月1日。我需要它们来测试一个应用程序,其中包含生日数字的数字用Luhn校验位进行验证。

到目前为止,我从现在开始减去年龄,给我一个最短的约会时间。然后我可以随机添加几年,几个月和几天。然而,后一个过程在获得错误的随机月份或日期方面是粗略的,可能会改变日期的最终年龄。

2 个答案:

答案 0 :(得分:2)

一种快速而肮脏的解决方案,使用min查找maxTicks之间的日期:

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 :(得分:1)

你可以尝试这样的事情:

//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);
}