在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)); }
为了获得更好的性能,如果这将被重复调用,请在函数之外创buildstart
和gen
(甚至可能是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)。