Ich suche nach einem prägnanten, modernen C # -Code, um ein zufälliges Datum zwischen dem 1. Januar 1995 und dem aktuellen Datum zu generieren.
Ich denke an eine Lösung, die Enumerable verwendet. Range kann dies irgendwie prägnanter machen.
Ich suche nach einem prägnanten, modernen C # -Code, um ein zufälliges Datum zwischen dem 1. Januar 1995 und dem aktuellen Datum zu generieren.
Ich denke an eine Lösung, die Enumerable verwendet. Range kann dies irgendwie prägnanter machen.
Antworten:
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));
}
Um eine bessere Leistung zu erzielen, wenn dies wiederholt aufgerufen wird, erstellen Sie die Variablen start
und gen
(und möglicherweise sogar range
) außerhalb der Funktion.
Dies ist eine leichte Reaktion auf Joels Kommentar, eine etwas optimierte Version zu erstellen. Anstatt ein zufälliges Datum direkt zurückzugeben, können Sie eine Generatorfunktion zurückgeben, die wiederholt aufgerufen werden kann, um ein zufälliges Datum zu erstellen.
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));
}
for (int i = 0; i < 100; i++) { array[i].DateProp = RandomDayFunc()(); }
var getRandomDate = RandomDayFunc();
Dann rufen Sie sie auf, um zufällige Daten zu erhalten: var randomDate = getRandomDate();
Denken Sie daran, dass Sie getRandomDate wiederverwenden müssen, damit dies nützlicher ist als Joels Antwort.
Ich habe die Antwort von @Joel Coehoorn genommen und die von ihm empfohlenen Änderungen vorgenommen - die Variable aus der Methode entfernen und alle in die Klasse einfügen. Außerdem ist die Zeit jetzt auch zufällig. Hier ist das Ergebnis.
class RandomDateTime
{
DateTime start;
Random gen;
int range;
public RandomDateTime()
{
start = new DateTime(1995, 1, 1);
gen = new Random();
range = (DateTime.Today - start).Days;
}
public DateTime Next()
{
return start.AddDays(gen.Next(range)).AddHours(gen.Next(0,24)).AddMinutes(gen.Next(0,60)).AddSeconds(gen.Next(0,60));
}
}
Und ein Beispiel für das Schreiben von 100 zufälligen DateTimes in die Konsole:
RandomDateTime date = new RandomDateTime();
for (int i = 0; i < 100; i++)
{
Console.WriteLine(date.Next());
}
range = (int)(DateTime.Today - start).TotalSeconds;
und return start.AddSeconds(gen.Next(range));
.
Wenn Sie eine alternative Optimierung vorstellen, können wir uns auch für einen Iterator entscheiden:
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));
}
Sie könnten es so verwenden:
int i=0;
foreach(DateTime dt in RandomDay())
{
Console.WriteLine(dt);
if (++i == 10)
break;
}
Beginnen Sie mit einem Objekt mit festem Datum (1. Januar 1995) und fügen Sie mit AddDays eine zufällige Anzahl von Tagen hinzu (achten Sie darauf, dass Sie das aktuelle Datum nicht überschreiten).
Ich bin etwas spät dran, aber hier ist eine Lösung, die gut funktioniert:
void Main()
{
var dateResult = GetRandomDates(new DateTime(1995, 1, 1), DateTime.UtcNow, 100);
foreach (var r in dateResult)
Console.WriteLine(r);
}
public static IList<DateTime> GetRandomDates(DateTime startDate, DateTime maxDate, int range)
{
var randomResult = GetRandomNumbers(range).ToArray();
var calculationValue = maxDate.Subtract(startDate).TotalMinutes / int.MaxValue;
var dateResults = randomResult.Select(s => startDate.AddMinutes(s * calculationValue)).ToList();
return dateResults;
}
public static IEnumerable<int> GetRandomNumbers(int size)
{
var data = new byte[4];
using (var rng = new System.Security.Cryptography.RNGCryptoServiceProvider(data))
{
for (int i = 0; i < size; i++)
{
rng.GetBytes(data);
var value = BitConverter.ToInt32(data, 0);
yield return value < 0 ? value * -1 : value;
}
}
}
Kleine Methode, die basierend auf einigen einfachen Eingabeparametern ein zufälliges Datum als Zeichenfolge zurückgibt. Gebaut basierend auf Abweichungen von den obigen Antworten:
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);
}