9

テストファイルを作成していますが、午前7時から午前11時までのランダムな時間でファイルを入力する必要があります。繰り返し入力しても、すべて同じでない限り問題ありません。

私もHH:MM(秒なし)だけに興味があります

どこから始めたらいいのかわからない。投稿する前にグーグルをやったのですが、面白い検索結果が見つかりました

www.random.org/clock-times/

唯一の問題は、「ランダムに」生成されるすべての時間が順番になっていることです。一度順序を狂わせることはできますが、100から10,000のエントリを生成する必要があります。

これを行うのに役立つWinFormC#アプリを作成したいと思っています。

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 に 1 を追加します。
于 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

簡単なオプション (時間と分を random として選択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
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

このようなもの:

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 に答える