我正在创建一个测试文件,我需要在上午7点到11点之间随机填充它。重复输入即可,只要它们不完全相同
我也只对HH:MM(没有秒)感兴趣
我不知道从哪里开始。在发布之前我做了谷歌,我发现了一个有趣的搜索结果
www.random.org/clock-times/
唯一的问题是“随机”生成的所有时间都是按顺序排列的。我可以把它排除在序列之外,但我需要生成100到10,000个条目。
我希望创建一个WinForm C#应用程序来帮助我做到这一点。
答案 0 :(得分:10)
为下限创建DateTime
值,并为随机生成器创建:
DateTime start = DateTime.Today.AddHours(7);
Random rnd = new Random();
现在您可以通过向其添加分钟来创建随机时间:
DateTime value = start.AddMinutes(rnd.Next(241));
要将其格式化为HH:MM,您可以使用自定义格式:
string time = value.ToString("HH:mm");
答案 1 :(得分:6)
计算开始和停止时间之间的分钟数,然后生成0到最大分钟数之间的随机数:
Random random = new Random();
TimeSpan start = TimeSpan.FromHours(7);
TimeSpan end = TimeSpan.FromHours(11);
int maxMinutes = (int)((end - start).TotalMinutes);
for (int i = 0; i < 100; ++i) {
int minutes = random.Next(maxMinutes);
TimeSpan t = start.Add(TimeSpan.FromMinutes(minutes));
// Do something with t...
}
注意:
答案 2 :(得分:3)
这是一种通用方法,可以在给定的开始日期和结束日期之间给出一个随机日期。
public static DateTime RandomDate(Random generator, DateTime rangeStart, DateTime rangeEnd)
{
TimeSpan span = rangeEnd - rangeStart;
int randomMinutes = generator.Next(0, (int)span.TotalMinutes);
return rangeStart + TimeSpan.FromMinutes(randomMinutes);
}
如果您经常使用此类内容,可以将其作为Random
上的扩展方法。
答案 3 :(得分:1)
创建Random
对象并使用该对象创建新的DateTime
Random rand = new Random();
//Note that Random.Next(int, int) is inclusive lower bound, exclusive upper bound
DateTime myDateTime = new DateTime(2012, 11, 27,
rand.Next(7, 11), rand.Next(0, 60), 0);
然后使用你想要的时间输出。
答案 4 :(得分:0)
List<DateTime> randomTimes = new List<DateTime>();
Random r = new Random();
DateTime d = new DateTime(2012, 11, 27, 7, 0, 0);
for (int i = 0; i < 100; i++)
{
TimeSpan t = TimeSpan.FromSeconds(r.Next(0, 14400));
randomTimes.Add(d.Add(t));
}
randomTimes.Sort();
数字14400
是上午7点到上午11点之间的秒数,用作随机数生成的基础。
randomTimes
列表可与DateTime格式一起使用,以实现所需的输出格式,例如:
Console.WriteLine("HH:mm", randomTimes[0]);
答案 5 :(得分:0)
var random = new Random();
var startDateTime = new DateTime(2000, 1, 1, 7, 0, 0, 0);
var maxDuration = TimeSpan.FromHours(4);
var values = Enumerable.Range(0, 100)
.Select(x => {
var duration = random.Next(0, (int)maxDuration.TotalMinutes);
return startDateTime.AddMinutes(duration).ToString("HH:mm");
})
.ToList();
values = values.Distinct().ToList();
Console.WriteLine("{0} values found. Min: {1}, Max: {2}", values.Count, values.Min(), values.Max());
把我的帽子扔进戒指:)
编辑:看到如此多的有效答案是一个死的简单问题,这有点令人尴尬。无论如何,很高兴看到不同的风格。阅读问题我很惊讶地看到OP要求创建Win Forms应用程序来执行此操作。任务似乎很直接,我想在LinqPad中编写解决方案!
答案 6 :(得分:0)
一个简单的选项(将小时和分钟选为随机ints
):
Random r = new Random();
//pick the hour
int h = r.Next(7,12);
//pick the minute
int m = 0;
if(h < 11)
m = r.Next(0,60);
//compose the DateTime
DateTime randomDT = new DateTime(year, month, day, h, m, 0);
答案 7 :(得分:0)
这样的事情:
private static Random rng = new Random();
public IEnumerable<DateTime> RandomDateTimes( DateTime lowerBound , DateTime upperBound , int count )
{
TimeSpan period = upperBound - lowerBound ;
if ( period <= TimeSpan.Zero || period > new TimeSpan(1,0,0,0) ) throw new ArgumentException();
if ( count < 0 ) throw new ArgumentException() ;
int rangeInMinutes = (int) period.TotalMinutes ; // period is 0 through 1440
for ( int i = 0 ; i < count ; ++i )
{
int offset = rng.Next(rangeInMinutes) ;
yield return lowerBound.AddMinutes(offset) ;
}
}
public IEnumerable<DateTime> OrderedRandomDateTimes( DateTime lowerbound , DateTime upperBound , int count )
{
yield return RandomDateTimes( lowerbound , upperBound , count ).OrderBy( x = x ) ;
}
答案 8 :(得分:0)
也许我错过了一些东西但不是这么简单......
Random rand = new Random();
// Range can be any number from 100 to 10000
Enumerable.Range(1, 10000).Select(v => TimeSpan.FromMinutes(rand.Next(420, 661)))
如果你想更简单地理解这些数字,你可以将它扩展出来......
Random rand = new Random();
int startTime = Convert.ToInt32(TimeSpan.FromHours(7).TotalMinutes);
int endTime = Convert.ToInt32(TimeSpan.FromHours(11).TotalMinutes) + 1; // To make 11:00 inclusive
Enumerable.Range(1, 10000).Select(v => TimeSpan.FromMinutes(rand.Next(startTime, endTime))).Dump();