【问题标题】:Generate a random birthday given an age [closed]给定年龄生成随机生日[关闭]
【发布时间】:2017-11-06 08:11:21
【问题描述】:

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

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

到目前为止,我所做的是从现在减去年龄,给我一个最短日期。然后我可以随机添加年份、月份和日期。然而,就获取错误的随机月份或日期而言,后一个过程很粗糙,可能会改变日期的最终年龄。

【问题讨论】:

  • 你能贴出代码吗?你试过什么?
  • 请澄清您所说的“猜测”是什么意思。此外,您应该在问题中添加您已经尝试过的内容,看看您需要什么输入以及您期望什么输出会很有用。
  • @Kyle 我会的,但我在工作中问过这个问题,而且我家里只有来源。
  • @ProfK 看看这个fiddle。在我提交之前,问题已关闭。
  • @ProfK 提供了一个minimal reproducible example 你到目前为止所尝试的内容。这样问题就可以成为话题。您说您目前有该算法的候选者。

标签: c# algorithm datetime random


【解决方案1】:

使用Ticks 查找minmax 之间的日期的快速而简单的解决方案:

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

【讨论】:

  • 使用记号得一分。我自己也在想很长的类似台词。
【解决方案2】:

你可以试试这样的:

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

【讨论】:

  • 现在看起来很像我正在寻找的东西。谢谢!如果它运作良好,您将不得不等到我可以提供赏金才能接受,因为您确实应该得到一个,因为a)理解足够简单的问题,b)如果您不能理解这样一个简单的要求,请不要责备我。
  • @ProfK 很高兴我能帮上忙。我认为这个问题已经很清楚了,但是社区投票反对并标记了它,因为它缺乏你编写代码的尝试
  • 在这种情况下社区该死。我想得非常好——我并不总是需要代码来解决编码问题,只是因为他们需要它,因为他们无法理解叙述。无论如何,我现在已经谴责了我目前的算法候选人。
  • @ProfK 看看这个fiddle 与上面类似,但经过重构以接受年龄范围。
猜你喜欢
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
相关资源
最近更新 更多