11

我实现了下面的 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;
    }
4

5 回答 5

30

您可以更改为:

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.0和之间的数字1.0。在我的解决方案中,您的返回值不会是整数秒。我搬到rnd了类/结构上的一个字段。因为最好重复使用一个Random实例,而不是每次只需要一个额外的随机数时都创建一个新实例。

于 2013-01-24T21:23:12.077 回答
4

问题是:

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)

于 2013-01-24T16:23:51.887 回答
3

这是因为TimeSpan' 的构造函数需要 along预期的滴答声,而不是秒数。

var randTimeSpan = new TimeSpan(range.Ticks - rnd.Next(0, range.Ticks)); 
于 2013-01-24T16:24:06.750 回答
0

修复了 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);
}
于 2014-09-22T20:18:35.020 回答
0

我的想法是我们只需要在开始日期时间中添加一些随机数量的刻度,就可以在开始和结束之间获得一个随机日期。所以我的解决方案不会创建任何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 ) ));
    }
 }
于 2016-01-08T18:48:42.840 回答