11

以下の RandomDate を実装しましたが、常に「From」日付に近い値を取得し続けています。おそらくここで何かを見逃しています....

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()ました。私のソリューションでは、戻り値は整数の秒数にはなりません。そして、クラス/構造体のフィールドに移動しました。1 つのインスタンスを再利用するのが最善であり、追加の乱数が 1 つだけ必要になるたびに新しいインスタンスを作成するのではありません。0.01.0rndRandom

于 2013-01-24T21:23:12.077 に答える
4

問題はそれです:

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

SECONDS からではなく、TICKS から TimeSpan を作成しています。

必要なもの:

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

(キャストも確認してください - FromSeconds に double を渡す必要があります)

于 2013-01-24T16:23:51.887 に答える
3

これは、 を受け取るTimeSpanのコンストラクターがlong秒ではなくティックを期待するためです。

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 に答える