我以为我可以测试我在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);
}
}
这当然创造了很多范围,但它们没有给出特别有趣的结果,因为我总是在折叠它们之后只有一个范围。如何创建更有趣的范围?
答案 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)
确保您还为角落案例添加特定测试,例如:
随机测试的问题在于,您通常还必须复制在测试中执行计算的代码,否则,您要测试什么?除了再次完成工作并进行比较外,你怎么知道随机数据处理得当?
答案 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使用不同的值来控制重叠范围的可能性。