C#中的随机日期

时间:2008-10-12 00:01:38

标签: c# datetime random date

我正在寻找一些简洁,现代的C#代码来生成1995年1月1日到当前日期之间的随机日期。

我在想一些利用Enumerable.Range的解决方案可能会使这更简洁。

8 个答案:

答案 0 :(得分:213)

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

为了获得更好的性能,如果要重复调用此功能,请在该功能的之外创建<{1}}和start(甚至可能gen)变量。< / p>

答案 1 :(得分:21)

这是对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));
}

答案 2 :(得分:6)

我已经接受了@Joel Coehoorn的回答并做了他所建议的改变 - 将变量放在方法之外并将所有内容都放在课堂上。此外,现在时间也是随机的。结果如下。

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

并举例说明如何使用100个随机DateTimes来控制:

RandomDateTime date = new RandomDateTime();
for (int i = 0; i < 100; i++)
{
    Console.WriteLine(date.Next());
}

答案 3 :(得分: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;
}

答案 4 :(得分:3)

从固定日期对象开始(1995年1月1日),并使用AddDays添加随机天数(显然,注意不要超过当前日期)。

答案 5 :(得分:0)

我玩游戏有点迟了,但这是一个很好的解决方案:

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

答案 6 :(得分:0)

根据一些简单的输入参数以字符串形式返回随机日期的Small方法。基于以上答案的变体构建:

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

答案 7 :(得分:-1)

基于@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));
    }
}