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

131
задан Judah Gabriel Himango 13 September 2012 в 00:02
поделиться

4 ответа

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) переменные внешний из функции.

221
ответ дан Jeremy Thompson 13 September 2012 в 00:02
поделиться

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

3
ответ дан Gabriele D'Antona 13 September 2012 в 00:02
поделиться
  • 1
    Don' t используют Django' s |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));
}
22
ответ дан Bjørn Madsen 13 September 2012 в 00:02
поделиться

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

 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
ответ дан James Curran 13 September 2012 в 00:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: