2017-06-05 829 views
-5

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

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

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

+4

你可以发表进来的代码?你有什么尝试? – Kyle

+1

请说明*“guessing”*的含义。此外,您应该向问题中添加您已经尝试的内容,并且了解您需要哪些输入以及您期望的输出会很有用。 –

+0

@Kyle我会的,但是我在工作中问过这个问题,而且我只有在家的源代码。 – ProfK

回答

2

快速和肮脏的解决方案,发现使用Ticksminmax之间的日期:

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; 
} 
+0

使用蜱得分为1分。我自己也在思考类似的问题。 – ProfK

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); 
} 
+0

现在看起来很像我正在寻找的东西。谢谢!如果它很好地工作,你必须等到我接受之前可以发放赏金,因为你确实应该得到一个理解这个简单的问题,b)如果你不能理解这样一个简单的要求,那么不要指责我。 – ProfK

+0

@ProfK大声笑很高兴我可以帮忙。我认为这个问题已经足够清楚了,但是社区低估了它的标记,因为它没有尝试编码 – Nino

+0

社区在这种情况下被定罪。我认为它非常好 - 我并不总是需要代码来攻击编码问题,只是因为他们需要它,因为他们无法理解叙述。无论如何,我现在谴责我目前的算法的候选人。 – ProfK