1

範囲を折りたたむためのアルゴリズムについての質問で得たさまざまな答えをテストできると考えていました。そのため、一連の範囲全体を作成するメソッドを作成し、さまざまなメソッドがそれをどのように処理するかを確認する必要があると考えていました。

しかし、ランダムなものを生成することになると、私はあまり良くありません。私はこのようなものを作成しました:

    private static IEnumerable<Range<int>> GenerateRanges()
    {
        var r = new Random();
        var n = 10000;
        while(--n >= 0)
        {
            var start = r.Next(10000);
            var end = r.Next(10000);
            if (end < start)
                Swap(ref start, ref end);
            yield return Range.Create(start, end);
        }
    }

これはもちろん多くの範囲を作成しますが、それらを折りたたんだ後は常に1つの範囲しか得られないため、特に興味深い結果は得られません。より興味深い範囲を作成するにはどうすればよいですか?

4

4 に答える 4

1
private static IEnumerable<Range<int>> GenerateRanges(int amount, int max, float density, int seed)
{
    var r = new Random(seed);
    var commonLength = max * density / amount; // edited
    var maxLength = commonLength * 2;
    while(--amount >= 0)
    {
        var length = r.Next(maxLength);
        var start = r.Next(max - length);
        var end = start + length;
        yield return Range.Create(start, end);
    }
}

使用法は次のようになります:GenerateRanges(1000, 10000, 1.0, someTestSeed) または次のようになります:GenerateRanges(1000, 10000, .5, someTestSeed)重複を減らすため

于 2009-08-06T09:35:57.830 に答える
0

始点と終点を選択すると、範囲は均等に分散されず、中央に集中します。範囲の50%が中心点と重なります。

最初に範囲のサイズを選択し、次に下限と上限の間のどこかに配置します。つまり、0から10000までのサイズです。

private static IEnumerable<Range<int>> GenerateRanges(int minSize, int maxSize) {
   Random r = new Random();
   for (int n = 0; n < 10000; n++) {
      int size = r.Next(minSize, maxSize);
      int start = r.Next(10000 - size);
      yield return Range.Create(start, start + size);
   }
}

minSizeとmaxSizeに異なる値を使用して、範囲が重複する可能性を制御できます。

于 2009-08-06T10:07:00.827 に答える
0

次のように、コーナーケース用の特定のテストも追加してください。

  • 範囲の空のリスト
  • 2つの同一の範囲
  • 部分的に重なる2つの範囲
  • 部分的に重複しているが、逆の順序で指定されている2つの範囲(つまり、どちらを最初にリストに追加するかを変更する)
  • 重ならない2つの範囲、および両方の方法を確認する
  • 整数的に接触する2つの範囲(つまり、1-10と11-20)ですが、おそらく組み合わせるべきではありません

ランダムテストの問題は、通常、テスト自体で計算を実行するコードも複製する必要があることです。そうでない場合は、何に対してテストしますか?もう一度仕事をして比較することを除いて、ランダムデータが正しく処理されたことをどうやって知ることができますか?

于 2009-08-06T09:31:52.877 に答える
0

あなたはこれを試すことができます:

  • 小さいnから開始します-これにより、ある時点で重複しない領域が得られるはずです

  • 再現性のある結果が得られるように、ランダムには固定シードを使用します(さまざまな値に設定できます)。

他のアイデアは、生成にいくつかのループを使用することであり、各ループには独自の最小値と最大値のセットがあります。

var start = r.Next(5000);
var end = start + r.Next(1000);

var start = 6500 + r.Next(1000);
var end = start + r.Next(1000);

これにより、最終的に少なくとも2つの重複しない領域(約最大0〜6000および6500〜8500)が常に提供されます。

于 2009-08-06T09:34:27.473 に答える