Je recherche du code C # succinct et moderne pour générer une date aléatoire entre le 1er janvier 1995 et la date actuelle.
Je pense à une solution qui utilise Enumerable.Range peut en quelque sorte rendre cela plus succinct.
Je recherche du code C # succinct et moderne pour générer une date aléatoire entre le 1er janvier 1995 et la date actuelle.
Je pense à une solution qui utilise Enumerable.Range peut en quelque sorte rendre cela plus succinct.
Réponses:
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));
}
Pour de meilleures performances si cela est appelé à plusieurs reprises, créez les variables start
and gen
(et peut-être même range
) en dehors de la fonction.
C'est en légère réponse au commentaire de Joel sur la création d'une version légèrement plus optimisée. Au lieu de renvoyer directement une date aléatoire, pourquoi ne pas renvoyer une fonction de générateur qui peut être appelée à plusieurs reprises pour créer une date aléatoire.
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();
puis vous l'appelez pour obtenir des dates aléatoires: var randomDate = getRandomDate();
sachez que vous devez réutiliser getRandomDate pour que cela soit plus utile que la réponse de Joel.
J'ai pris la réponse de @Joel Coehoorn et apporté les modifications qu'il m'a conseillées - mettre la variable hors de la méthode et tout mettre en classe. De plus, maintenant, le temps est également aléatoire. Voici le résultat.
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));
}
}
Et exemple comment utiliser pour écrire 100 DateTimes aléatoires sur la console:
RandomDateTime date = new RandomDateTime();
for (int i = 0; i < 100; i++)
{
Console.WriteLine(date.Next());
}
range = (int)(DateTime.Today - start).TotalSeconds;
et return start.AddSeconds(gen.Next(range));
.
Eh bien, si vous voulez présenter une optimisation alternative, nous pouvons également opter pour un itérateur:
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));
}
vous pouvez l'utiliser comme ceci:
int i=0;
foreach(DateTime dt in RandomDay())
{
Console.WriteLine(dt);
if (++i == 10)
break;
}
Commencez avec un objet à date fixe (1er janvier 1995) et ajoutez un nombre aléatoire de jours avec AddDays (évidemment, faites attention à ne pas dépasser la date actuelle).
Je suis un peu en retard dans le jeu, mais voici une solution qui fonctionne bien:
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;
}
}
}
Petite méthode qui renvoie une date aléatoire sous forme de chaîne, basée sur quelques paramètres d'entrée simples. Construit sur la base de variations des réponses ci-dessus:
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);
}