2012-11-27 19 views
0

我正在創建一個測試文件,我需要在上午7點到11點之間隨機填充它。重複條目,只要確定他們是不是都一樣隨機時間發生器,用於7AM到11AM之間的時間

我也只能在HH感興趣:MM(無秒)

我不知道從哪裏開始。我做了谷歌發佈前,我發現了一個有趣的搜索結果

www.random.org/clock-times/ 

唯一的問題是,所有的時間「隨機」生成的順序排列。我可以把它排序一次,但我需要生成100到10,000條目。

我希望能夠創建一個WinForm C#應用程序,這將幫助我做到這一點。

+0

挑選一個隨機數** h ** [7,11]。如果** h ** <11,則選擇另一個隨機數** m ** [0,59],否則** m **爲0 – kaveman

回答

4

計算你的開始之間的分鐘數,並停止兩三次,產生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。
+0

我該如何使用t喜歡得到時間? –

0

創建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); 

然後使用你希望它輸出的時間。

+0

請注意,此解決方案可能會在上午11:00挑選時間,例如,上午11:15 – kaveman

+0

但現在上午11:00是不可能的... – kaveman

6

的下界創建一個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"); 
3

這是一個通用的方法給你一個隨機的d在給定的開始日期和結束日期之間吃飯。

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擴展方法。

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是上午07點到11 AM,其被用作用於隨機數生成的基礎之間的秒數。

randomTimes列表可以通過日期時間的格式來實現所需的輸出格式,如:

Console.WriteLine("HH:mm", randomTimes[0]); 
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中編寫解決方案!

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

如果你想讓它更簡單地理解你可以得到的數字pand 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();