Генерация псевдослучайного дерева каталогов?

Я пытаюсь написать программу, которая будет псевдослучайно автогенерировать (на основе начального значения, чтобы я мог повторно запустить один и тот же тест более одного раза) растущую структуру каталогов, состоящую из файлов. (это для стресс-тестирования установки базы данных управления версиями)

Мне было интересно, знал ли кто-нибудь из вас о чем-то похожем на квазирандомные последовательности "заполнения пространства" (например,последовательности ван дер корп или Халтон последовательности) это может сработать здесь.

edit: или фрактальный алгоритм. Это подозрительно похоже на фрактальный алгоритм.


edit 2: неважно, я думаю, что понял очевидное решение, начните с пустого дерева и просто используйте последовательные выходы генератора псевдослучайных сигналов, чтобы детерминированно (на основе сгенерированного числа и состояния дерева, сгенерированного до сих пор) сделать одно из N действий, например, сделать новый подкаталог, добавить новый файл, переименовать файл, удалить файл и т. д.

I хотите сделать это таким образом, а не просто последовательно сбрасывать файлы в структуру папок, потому что мы сталкиваемся с ситуацией, когда у нас возникли проблемы с большими #s файлов, и не уверены, что именно является причиной. (глубина дерева, # переименований, # удалений и т. д.)

Это не просто 1 фиксированное дерево, которое мне нужно создать, стратегия использования: немного вырастите древовидную структуру, оцените некоторую статистику производительности, немного увеличьте древовидную структуру, оцените некоторые статистика производительности и т. д.

3 ответов


Как вы упомянули во втором редактировании, я, вероятно, реализовал бы все это как обход дерева файлов, с PRNG, решающим "изменить в каталог", "создать каталог", "переместить на один уровень", "создать файл", "удалить файл" и иметь другое значение, чтобы определить, какой файл удалить, какой каталог изменить и создать имена для файлов и каталогов.

Я использовал аналогичный метод для стресс-тестирования сервера рабочего процесса, который я написал (хотя мне не нужно было отслеживать, где работать предметы были, просто нужно было случайным образом выбрать один для работы).


Если это только для тестирования, что не так с некоторым простым, наивным алгоритмом генерации? Например, сгенерируйте случайное (1-10) количество подкаталогов, сгенерируйте для них имена, затем для каждого каталога рекурсивно сгенерируйте подкаталоги и некоторое количество файлов.

Это легко настраивается, и вы можете управлять семенем для rand. Для более фанковых потребностей распределение количества файлов / каталогов может быть нелинейным, но что-то, что соответствует вашим потребностям больше.

звучит что-то, что можно взбить за полчаса и покончить с этим. Я не вижу необходимости в чем-то математическом или сложном. Если это не просто для удовольствия, конечно : -)


Это набор различных проблем, что делает его забавной головоломкой.

во-первых у нас есть генератор псевдослучайных чисел. Есть много вещей, доступных. Я ожидаю только функцию, которая создает число в диапазоне от 0..Н-1.

тогда у нас есть алгоритм для определения количества подузлов на одном узле. Есть соблазн использовать линейную функцию, но это не отражает действительности. Таким образом, вы можете создать следующее функция:

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

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

эта функция производит небольшом количестве. Большинство будет в диапазоне 0..Но вершина практически бесконечна. Если вы хотите иметь большие числа, вы также можете использовать больший порог

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 на девятом и выше.

конечно, вы можете настроить параметры, чтобы создать необходимое дерево.