【问题标题】:Lengths of cycles in random sequence随机序列中的周期长度
【发布时间】: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 的 RandomRandomNumberGenerator 类,以及从 random.org 生成的随机数据。它们似乎都产生了相似的结果。

我做错了吗?从数学的角度来看,这些结果是预期的吗?或者,也许,我使用的随机函数的伪特性有副作用?

【问题讨论】:

    标签: c# arrays algorithm random cycle


    【解决方案1】:

    您正在做的是生成大小为count 的随机排列。然后检查排列的属性。如果你的随机数生成器不错,那么你应该观察random permutations的统计数据。

    对于k<count,长度为 k 的平均循环数为 1/k。平均而言,有 1 个固定点,长度为 2 的 1/2 个周期,长度为 3 的 1/3 个周期等。因此,任何长度的平均周期数为 1+1/2+1/3+... +1/计数 ~ ln 计数 + gammadistribution of the number of cycles 有很多简洁的属性。偶尔会有很多循环,但是 2^# 个循环的平均值是 count+1。

    您的存储桶对应于不同循环长度的数量,最多为循环数,但由于循环长度重复,可能会更低。平均而言,重复的周期长度很少。即使计数增加到无穷大,平均循环数增加到无穷大,重复循环长度的平均数仍然是有限的。

    在统计学中的置换测试中,通常是bootstrapping的例子,分析某些类型的数据,你把它看成是置换的例子。例如,您可能会观察到两个量 x_i 和 y_i。您可以通过对 xs 和 ys 进行排序并查看 y 值的索引与第 k 个 x 值配对来获得排列。然后,您将此排列的统计数据与随机排列的属性进行比较。这并没有对底层分布做出太多假设,但它仍然可以检测 x 和 y 何时似乎相关。因此,了解对随机排列的期望是很有用的。

    【讨论】:

    • 请原谅我的无知,但我希望能得到一些澄清。鉴于我得到了如此多的重复周期长度以及更高的长度往往有更多的重复这一事实,这是从数学/统计的角度预期的,还是我们应该责怪Random函数可能只生成某些类型具有相似性质的排列?
    • @yuramag:我们用重复的周期长度来表示不同的东西。假设 x 的循环长度为 5:f^5(x)=x。那么 f(x)、f^2(x)、f^3(x) 和 f^4(x) 的循环长度也都为 5。周期正好为 5(代码中的值为 4)循环的元素数量是 5 的倍数。只有当您有 10 个或更多,或者通常有 2k 个循环长度为 k 的元素时,我才将其视为重复。如果你有超过 0,你总是至少有 k。所以,我没有看到任何迹象表明你的 RNG 有问题。
    猜你喜欢
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    相关资源
    最近更新 更多