当前位置:  开发笔记 > 编程语言 > 正文

C#中的随机日期

如何解决《C#中的随机日期》经验,为你挑选了4个好方法。

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

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



1> Joel Coehoor..:
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));
}

为了获得更好的性能,如果重复调用它,请在函数外部创建startgen(甚至可能range)变量.


实际上,Random甚至不是特别伪随机的,除非你将实例保持一段时间并保持从中获取值.
这就是为什么这只是一个样本,而不是生产代码.

2> JaredPar..:

这是对Joel关于制作更优化版本的评论的轻微回应.为什么不返回可以重复调用以创建随机日期的生成器函数,而不是直接返回随机日期.

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


如何使用此功能,有人可以解释一下吗?我的意思是我怎么称呼它?
@BurakKarakuş:你首先得到一个工厂:`var getRandomDate = RandomDayFunc();`然后你调用它来获得随机日期:`var randomDate = getRandomDate();`请注意你需要重复使用getRandomDate才能让它更多比Joel的答案有用.

3> prespic..:

我已经采取了@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());
}



4> James Curran..:

好吧,如果你要提出备用优化,我们也可以选择迭代器:

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


@JaredPar,这不太对.仅仅因为类型实现IDisposable并不意味着它可以最终化.
推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有