范围之间的随机日期时间 – 不统一输出

我实现了下面的RandomDate,但我总是让值关闭到“从”日期,我可能会错过这里的东西….

public static DateTime GetRandomDate(DateTime from, DateTime to) { var range = new TimeSpan(to.Ticks - from.Ticks); var rnd = new Random(); var randTimeSpan = new TimeSpan((long)(range.TotalSeconds - rnd.Next(0, (int)range.TotalSeconds))); return from + randTimeSpan; } 

你可以改为:

 static readonly Random rnd = new Random(); public static DateTime GetRandomDate(DateTime from, DateTime to) { var range = to - from; var randTimeSpan = new TimeSpan((long)(rnd.NextDouble() * range.Ticks)); return from + randTimeSpan; } 

说明:我使用了NextDouble()因为它给出了一个介于0.01.0之间的数字。 在我的解决方案中,您的返回值不会是整数秒。 我把rnd移到了class / struct的一个字段上。 因为最好重用一个Random实例,而不是每次只需要一个随机数就创建一个新实例。

问题是:

 var randTimeSpan = new TimeSpan((long)(range.TotalSeconds - rnd.Next(0, (int)range.TotalSeconds))); 

正在从TICKS创建TimeSpan,而不是从SECONDS创建。

你需要:

 var randTimeSpan = TimeSpan.FromSeconds((long)(range.TotalSeconds - rnd.Next(0, (int)range.TotalSeconds))); 

(请检查演员表 – 它需要是传递给FromSeconds的双倍)

这是因为TimeSpan的构造函数需要很long而不是秒。

 var randTimeSpan = new TimeSpan(range.Ticks - rnd.Next(0, range.Ticks)); 

修复了ArgumentOutOfRangeException:

 public static DateTime GetRandomDateTime(DateTime? min = null, DateTime? max = null) { min = min ?? new DateTime(1753, 01, 01); max = max ?? new DateTime(9999, 12, 31); var range = max.Value - min.Value; var randomUpperBound = (Int32) range.TotalSeconds; if (randomUpperBound <= 0) randomUpperBound = Rnd.Next(1, Int32.MaxValue); var randTimeSpan = TimeSpan.FromSeconds((Int64) (range.TotalSeconds - Rnd.Next(0, randomUpperBound))); return min.Value.Add(randTimeSpan); } 

这对我有用。 日期间隔为28天,以避免2月份的例外情况。

 Random r = new Random(); DateTime rDate = new DateTime(r.Next(1900, 2010), r.Next(1, 12), r.Next(1, 28)); 

我的想法是我们只需要添加一些随机数的刻度来开始日期时间以获得开始和结束之间的随机日期。 所以我的解决方案不会创建任何TimeSpan对象。

 private static readonly Random random = new Random (); private static readonly object syncLock = new object (); public static DateTime RandomDate(DateTime from, DateTime to) { lock ( syncLock ) { return from.AddTicks ((long) ( random.NextDouble () * ( to.Ticks - from.Ticks ) )); } }