Случайная дата в С#

Я ищу короткий, современный код С# для создания случайной даты между 1 января 1995 года и текущей датой.

Я думаю о каком-то решении, которое использует Enumerable.Range каким-то образом может сделать это более кратким.

Ответ 1

private Random gen = new Random();
DateTime RandomDay()
{
    DateTime start = new DateTime(1995, 1, 1);
    int range = (DateTime.Today - start).Days;           
    return start.AddDays(gen.Next(range));
}

Для повышения производительности, если это будет вызываться повторно, создайте переменные start и gen (и, возможно, даже range) вне функции.

Ответ 2

Это в некотором отклике на комментарий Джоэла о создании более оптимизированной версии. Вместо того, чтобы напрямую возвращать случайную дату, почему бы не вернуть функцию генератора, которая может быть вызвана повторно для создания случайной даты.

Func<DateTime> RandomDayFunc()
{
    DateTime start = new DateTime(1995, 1, 1); 
    Random gen = new Random(); 
    int range = ((TimeSpan)(DateTime.Today - start)).Days; 
    return () => start.AddDays(gen.Next(range));
}

Ответ 3

Я принял @Joel Coehoorn ответ и внес изменения, которые он посоветовал, - выложите переменную из метода и поместите все в класс. Плюс теперь время тоже случайное. Вот результат.

class RandomDateTime
{
    DateTime start;
    Random gen;
    int range;

    public RandomDateTime()
    {
        start = new DateTime(1995, 1, 1);
        gen = new Random();
        range = (DateTime.Today - start).Days;
    }

    public DateTime Next()
    {
        return start.AddDays(gen.Next(range)).AddHours(gen.Next(0,24)).AddMinutes(gen.Next(0,60)).AddSeconds(gen.Next(0,60));
    }
}

И пример того, как использовать для записи 100 случайных DateTimes для консоли:

RandomDateTime date = new RandomDateTime();
for (int i = 0; i < 100; i++)
{
    Console.WriteLine(date.Next());
}

Ответ 4

Хорошо, если вы представите альтернативную оптимизацию, мы также можем пойти итератором:

 static IEnumerable<DateTime> RandomDay()
 {
    DateTime start = new DateTime(1995, 1, 1);
    Random gen = new Random();
    int range = ((TimeSpan)(DateTime.Today - start)).Days;
    while (true)
        yield return  start.AddDays(gen.Next(range));        
}

вы можете использовать его следующим образом:

int i=0;
foreach(DateTime dt in RandomDay())
{
    Console.WriteLine(dt);
    if (++i == 10)
        break;
}

Ответ 5

Начните с объекта с фиксированной датой (1 января 1995 года) и добавьте случайное число дней с помощью AddDays (obviusly, обратите внимание, не превышая текущую дату).