C#:用于创建随机均匀分布的可能重叠范围的算法

时间:2009-08-06 09:26:50

标签: c# algorithm range

我以为我可以测试我在algorithm for collapsing ranges的问题中得到的各种答案。所以我在想我应该创建一个创建一大堆范围的方法,看看各种方法如何处理它。

但是当谈到产生随机的东西时,我并不是很好。我创造了这样的东西:

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

这当然创造了很多范围,但它们没有给出特别有趣的结果,因为我总是在折叠它们之后只有一个范围。如何创建更有趣的范围?

4 个答案:

答案 0 :(得分: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)以减少重叠

答案 1 :(得分:0)

确保您还为角落案例添加特定测试,例如:

  • 空列表范围
  • 两个相同的范围
  • 两个部分重叠的范围
  • 两个部分重叠的范围,但以相反的顺序指定(即更改哪一个首先添加到列表中)
  • 两个不重叠的范围,并检查两种方式
  • 两个触及(即1-10和11-20)整数的范围,但它们可能不应合并

随机测试的问题在于,您通常还必须复制在测试中执行计算的代码,否则,您要测试什么?除了再次完成工作并进行比较外,你怎么知道随机数据处理得当?

答案 2 :(得分: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);

这应该总是给你至少两个不重叠的区域(大约最大0-6000和6500-8500)

答案 3 :(得分: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使用不同的值来控制重叠范围的可能性。