【发布时间】:2015-09-03 00:01:15
【问题描述】:
以下LINQPad 代码生成从 0 到 N 的唯一整数的随机序列,并计算从 0 开始的每个整数的循环长度。为了计算给定整数的循环长度,它从 boxes 读取值索引处等于该整数的数组,然后获取该值并从等于该值的索引中读取,依此类推。当从数组中读取的值等于我们开始的原始整数时,该过程停止。计算每个循环长度所花费的迭代次数保存到Dictionary。
const int count = 100;
var random = new Random();
var boxes = Enumerable.Range(0, count).OrderBy(x => random.Next(0, count - 1)).ToArray();
string.Join(", ", boxes.Select(x => x.ToString())).Dump("Boxes");
var stats = Enumerable.Range(0, count).ToDictionary(x => x, x => {
var iterations = 0;
var ind = x;
while(boxes[ind] != x)
{
ind = boxes[ind];
iterations++;
}
return iterations;
});
stats.GroupBy(x => x.Value).Select(x => new {x.Key, Count = x.Count()}).OrderBy(x => x.Key).Dump("Stats");
stats.Sum(x => x.Value).Dump("Total Iterations");
典型结果如下:
我得到的结果对我来说似乎很奇怪:
- 所有循环的长度只能分组到几个桶中(通常是 3 到 7 个)。我希望看到更多不同的存储桶。
- 每个桶中的元素数量大部分时间与它们所属的桶值一起增长。我希望它会更随机。
我尝试了几种不同的随机化函数,例如 .NET 的 Random 和 RandomNumberGenerator 类,以及从 random.org 生成的随机数据。它们似乎都产生了相似的结果。
我做错了吗?从数学的角度来看,这些结果是预期的吗?或者,也许,我使用的随机函数的伪特性有副作用?
【问题讨论】:
标签: c# arrays algorithm random cycle