9

我正在创建一个测试文件,我需要用早上 7 点到 11 点之间的随机时间填充它。重复条目是可以的,只要它们不完全相同

我也只对 HH:MM 感兴趣(没有秒数)

我不知道从哪里开始。我在发帖前做了谷歌,发现了一个有趣的搜索结果

www.random.org/clock-times/

唯一的问题是所有“随机”生成的时间都是按顺序排列的。我可以把它打乱一次,但我需要生成 100 到 10,000 个条目。

我希望创建一个 WinForm C# 应用程序来帮助我做到这一点。

4

9 回答 9

15

计算开始和停止时间之间的分钟数,然后生成一个介于 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...
}

笔记:

  • 您应该只创建一个随机对象,否则您将连续获得许多重复对象。
  • 开始时间包括在内,但结束时间不包括在内。如果您还想包括结束时间,请将 1 添加到 maxMinutes。
于 2012-11-27T18:20:10.387 回答
12

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");
于 2012-11-27T18:18:34.117 回答
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.

于 2012-11-27T18:19:01.867 回答
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);

然后在你想要的地方使用时间输出。

于 2012-11-27T18:18:13.453 回答
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]);
于 2012-11-27T18:23:19.693 回答
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 中编写解决方案!

于 2012-11-27T18:23:34.157 回答
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);
于 2012-11-27T18:29:15.323 回答
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 ) ;
}
于 2012-11-27T18:30:45.637 回答
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();
于 2012-11-27T18:46:11.607 回答