Random Time Generator for time betweeen 7AM to 11A

2020-06-20 02:55发布

I am creating a test file and I need to fill it with random times between 7AM to 11AM. Repeating entries are OK as long as they aren't all the same

I'm also only interested in HH:MM (no seconds)

I don't know where to start. I did Google before posting and I found an interesting search result

www.random.org/clock-times/

Only issue is that all times "randomly" generated are in sequential order. I can put it out of sequence once but I need to generate 100 to 10,000 entries.

I am hoping to create a WinForm C# app that will help me do this.

9条回答
男人必须洒脱
2楼-- · 2020-06-20 03:25

Calculate the number of minutes between your start and stop times then generate a random number between 0 and the maximum number of minutes:

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

Notes:

  • You should only create one random object, otherwise you will get many duplicates in a row.
  • The start time is inclusive but the end time is exclusive. If you want to include the end time too, add 1 to maxMinutes.
查看更多
爷的心禁止访问
3楼-- · 2020-06-20 03:27

Here is a generic method to give you a random date between a given start and end date.

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

If you use something like this a lot you could make it an extension method on Random.

查看更多
趁早两清
4楼-- · 2020-06-20 03:38

Maybe I am missing something but isn't it as simple as this...

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

If you wanted to make it simplier to understand the numbers you could expand it out....

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();
查看更多
可以哭但决不认输i
5楼-- · 2020-06-20 03:43

Something like this:

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 ) ;
}
查看更多
霸刀☆藐视天下
6楼-- · 2020-06-20 03:44
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());

Throwing my hat in the ring :)

Edit: It's slightly embarrassing to see so many answers for effectively is a dead simple question. Anyway, nice to see different styles. Reading the question I was surprised to see the OP ask to create Win Forms app to do this. The task seemed so straight forward, I wanted to write the solution in LinqPad!

查看更多
闹够了就滚
7楼-- · 2020-06-20 03:46

Create a Random object and use that to create a new 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);

Then use the time output where you want it.

查看更多
登录 后发表回答