1995年1月1日から現在の日付までのランダムな日付を生成するための簡潔で最新のC#コードを探しています。
私はEnumerable.Rangeを利用するいくつかの解決策を考えています。どういうわけかこれをより簡潔にするかもしれません。
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
) 変数を作成します。
これは、少しだけ最適化されたバージョンを作成することについての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));
}
別の最適化を提示する場合は、反復子を使用することもできます。
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;
}
固定日付オブジェクト(1995年1月1日)から開始し、AddDaysでランダムな日数を追加します(明らかに、現在の日付を超えないように注意してください)。
単純な入力パラメーターに基づいて、ランダムな日付を文字列として返す小さなメソッド。上記の回答のバリエーションに基づいて構築されています。
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);
}