伪随机目录树生成?

时间:2009-02-05 19:58:51

标签: algorithm random tree fractals

我正在尝试编写一个伪随机自动生成的程序(基于种子值,因此我可以多次重新运行相同的测试)一个由文件组成的不断增长的目录结构。 (这是对源代码管理数据库安装进行压力测试)

我想知道你们中是否有人知道类似于quasirandom“空间填充”序列(例如van der Corput sequencesHalton sequences)可能在这里工作的东西。

编辑:或分形算法。这听起来像是分形算法。


编辑2:没关系,我想我找出了明显的解决方案,从空树开始,只是确定性地使用伪随机生成器的顺序输出(基于生成的数字和到目前为止生成的树的状态)做N个动作中的一个,例如创建一个新的子目录,添加一个新文件,重命名文件,删除文件等等。

我想这样做而不是仅仅顺序地将文件转储到文件夹结构中,因为我们遇到了大量文件存在问题的情况,并且不确定原因是什么是。 (树深度,重命名数,删除数量等)

这不仅仅是我需要生成的一个固定树,使用策略是:稍微增加树结构,评估一些性能统计,增加树结构,评估一些性能统计等等。

3 个答案:

答案 0 :(得分:2)

如果仅用于测试,那么一些简单,天真的生成算法有什么问题?比如,生成随机(1-10)数量的子目录,为它们生成名称,然后为每个目录递归生成子目录和一些文件。

这很容易定制,您可以控制rand的种子。对于更苛刻的需求,文件/目录数量的分布可以是非线性的,但更适合您的需求。

听到可以在半小时内完成的事情并完成。我没有看到需要数学或复杂的东西。除非这只是为了好玩,当然: - )

答案 1 :(得分:1)

这是一系列不同的问题,使它成为一个有趣的难题。

首先我们有伪随机数生成器。有很多东西可供选择。我只期望一个函数创建一个0..n-1范围内的数字。

然后我们有一个算法来确定单个节点上的子节点数。使用线性函数很有吸引力,但这不是对现实的公平表示。因此,您可以创建以下功能:

randomsize() {
  int n = Random(0,10);
  if (n<10) return n;

  return Random(0,9) + 10 * random;
}

此功能产生较小的数字。大多数将在0..9范围内,但顶部几乎无穷无尽。如果你想拥有更大的数字,你也可以使用更大的门槛

randomsize() {
  int n = Random(0,100);
  if (n<10) return n;

  return Random(0,9) + 10 * random;
}

最后一个问题是如何创建树。这很简单。但是你应该记住,算法必须结束。因此,您需要执行以下操作之一:

  • 使用最大深度
  • 根据嵌套级别递减生成的数字
  • 确定叶子数占总子节点的百分比。这个百分比应该在更高的水平上增加(第一级为10-50,第二级为20-60。第五级为50-100,第六级为60-100,第九级为90-100,以及更高。

当然,您可以调整参数以创建所需的树。

答案 2 :(得分:1)

正如您在第二次编辑中提到的那样,我可能会将整个事情实现为文件树遍历,PRNG决定“更改目录”,“创建目录”,“向上移动一级”,“创建文件” ,“删除文件”并有另一个值来确定要删除的文件,要更改的目录以及为文件和目录生成名称。

我使用类似的方法对我编写的工作流服务器进行压力测试(虽然我不需要跟踪工作项的位置,只需随机选择一个进行操作)。