在C#中的随机date

我正在寻找一些简洁的现代C#代码来生成1995年1月1日至当前date之间的随机date。

我想一些利用Enumerable.Range的解决scheme可能会使这个更简洁。

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

为了获得更好的性能,如果这将被重复调用,请在函数之外创buildstartgen (甚至可能是range )variables。

这对Joel关于制作稍微更优化的版本的评论略有回应。 为了不直接返回一个随机数据,为什么不返回一个可重复调用的生成器函数来创build一个随机数据。

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

我已经采取了@Joel Coehoorn的回答,并提出了他所build议的改变 – 把variables放在方法之外,并把所有的东西放在课堂上。 现在时间也是随机的。 结果如下。

 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个随机date时间写入控制台:

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

那么,如果你要提出交替优化,我们也可以去一个迭代器:

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

从一个固定的date对象开始(1995年1月1日),然后在AddDays中添加一个随机数(注意不要超过当前date)。