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

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

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

你可以试试这个:

  • 从较小的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)

于 2009-08-06T09:34:27.473 回答
0

确保您还为极端情况添加了特定测试,如下所示:

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

随机测试的问题在于,通常您还必须复制在测试本身中执行计算的代码,否则,您将针对什么进行测试?除了再次执行这项工作并进行比较之外,您如何知道随机数据已正确处理?

于 2009-08-06T09:31:52.877 回答
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 回答