150 votes

Date aléatoire en C#

Je cherche un code C# succinct et moderne pour générer une date aléatoire entre le 1er janvier 1995 et la date actuelle.

Je pense qu'une solution qui utilise Enumerable.Range d'une manière ou d'une autre pourrait rendre cela plus succinct.

0 votes

Réponse en DateTime aléatoire entre deux plages - sortie non unifiée a une méthode d'aide avec les paramètres de date "From/To".

1voto

user16789193 Points 29
Random rnd = new Random();
DateTime datetoday = DateTime.Now;

int rndYear = rnd.Next(1995, datetoday.Year);
int rndMonth = rnd.Next(1, 12);
int rndDay = rnd.Next(1, 31);

DateTime generateDate = new DateTime(rndYear, rndMonth, rndDay);
Console.WriteLine(generateDate);

//Cette méthode n'est peut-être pas la meilleure, mais elle est rapide et facile à comprendre.

0voto

Hamit Gündogdu Points 174

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

0voto

BernardV Points 155

Petite méthode qui renvoie une date aléatoire sous forme de chaîne, en fonction de quelques paramètres d'entrée simples. Construit à partir 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);
}

-1voto

Ben Points 9

Extension utile basée sur la solution de @Jeremy Thompson

public static class RandomExtensions
{
    public static DateTime Next(this Random random, DateTime start, DateTime? end = null)
    {
        end ??= new DateTime();
        int range = (end.Value - start).Days;
        return start.AddDays(random.Next(range));
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X