151

1995年1月1日から現在の日付までのランダムな日付を生成するための簡潔で最新のC#コードを探しています。

私はEnumerable.Rangeを利用するいくつかの解決策を考えています。どういうわけかこれをより簡潔にするかもしれません。

4

9 に答える 9

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

これが繰り返し呼び出される場合のパフォーマンスを向上させるには、関数の外側startにand gen(場合によってはrange) 変数を作成します。

于 2008-10-12T00:06:45.693 に答える
28

これは、少しだけ最適化されたバージョンを作成することについてのJoelのコメントに対するわずかな応答です。ランダムな日付を直接返すのではなく、繰り返し呼び出してランダムな日付を作成できるジェネレーター関数を返しませんか。

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));
}
于 2008-10-12T02:18:09.983 に答える
5

別の最適化を提示する場合は、反復子を使用することもできます。

 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;
}
于 2008-10-12T03:16:57.197 に答える
3

固定日付オブジェクト(1995年1月1日)から開始し、AddDaysでランダムな日数を追加します(明らかに、現在の日付を超えないように注意してください)。

于 2008-10-12T00:04:35.103 に答える
0

単純な入力パラメーターに基づいて、ランダムな日付を文字列として返す小さなメソッド。上記の回答のバリエーションに基づいて構築されています。

public string RandomDate(int startYear = 1960, string outputDateFormat = "yyyy-MM-dd")
{
   DateTime start = new DateTime(startYear, 1, 1);
   Random gen = new Random(Guid.NewGuid().GetHashCode());
   int range = (DateTime.Today - start).Days;
   return start.AddDays(gen.Next(range)).ToString(outputDateFormat);
}
于 2020-03-10T06:35:13.443 に答える