我正在寻找一些简洁,现代的C#代码来生成1995年1月1日到当前日期之间的随机日期。
我在想一些利用Enumerable.Range的解决方案可能会使其更加简洁。
答案在随机日期时间范围之间-不统一输出具有辅助方法,从/到目前为止参数
—
迈克尔Freidgeim
我正在寻找一些简洁,现代的C#代码来生成1995年1月1日到当前日期之间的随机日期。
我在想一些利用Enumerable.Range的解决方案可能会使其更加简洁。
Answers:
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));
}
为了获得更好的性能,如果将其重复调用,请在函数外部创建start
和gen
(甚至是range
)变量。
这是对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));
}
for (int i = 0; i < 100; i++) { array[i].DateProp = RandomDayFunc()(); }
var getRandomDate = RandomDayFunc();
然后调用它来获取随机日期:var randomDate = getRandomDate();
记住,您需要重用getRandomDate,以使其比Joel的答案更有用。
我接受了@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());
}
range = (int)(DateTime.Today - start).TotalSeconds;
和return start.AddSeconds(gen.Next(range));
。
好吧,如果您要提出替代性优化,我们也可以选择迭代器:
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;
}
从固定日期对象开始(1995年1月1日),然后使用AddDays添加随机天数(显然,请注意不要超过当前日期)。
我玩游戏有点迟了,但是这里有一个很好的解决方案:
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;
}
}
}
一种小型方法,它基于一些简单的输入参数以字符串形式返回随机日期。基于以上答案的变体构建:
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);
}