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
) переменные внешний из функции.
Запустите с фиксированного объекта даты (Jan 1, 1995), и добавьте случайное количество дней с AddDays (очевидно, обратите внимание, не превосходящее текущую дату).
|timesince
для вычисления timedelta за несколько лет, потому что это не считает в течение многих високосных годов и таким образом приводит к неточным результатам. См. билет № 19210 Django для большего количества информации об этом.
– jnns
13 November 2013 в 11:39
Это находится в небольшом ответе на комментарий Joel о создании немного более оптимизированной версии. Вместо того, чтобы возвратить случайную дату непосредственно, почему бы не возвратить функцию генератора, которая может быть вызвана неоднократно для создания случайной даты.
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));
}
Ну, если Вы собираетесь представить альтернативную оптимизацию, мы можем также пойти для итератора:
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;
}