La orientación que te dio Dem0 está muy buena. La estructura de árboles la daría casi por sentada, porque hoy en día todo sistema de archivos funciona así.
Depende también cuanto sepas también de proba, porque veo que sos ingresante (sin discriminar eh! xD), pero por ejemplo, para muchas carpetas la cantidad de archivos podría estar dada por una función de probabilidad... ya que ponele, en el caso de las de música, la cantidad oscila altamente entre los 10 y 20 temas, debido a que muchas veces uno crea carpetas con los discos de artistas.
Lo mismo con los discos de artistas, la cantidad media estaría en 3 ponele, y bueno, sería menor para valores menores y mayores.
Una función de probabilidad lo que hace es asignar a cada valor una cierta probabilidad de aparecer. Acá como los valores de entrada (número de archivos o carpetas) son enteros, la función es mucho más simple. Lo más fácil es armar un par de funciones a mano, según el tipo de carpeta que generen. Por ejemplo, la función "GenerarAlbumes" tendría como 30% de proba para generar 3 discos (digo, me suena a que es un promedio lógico en general), y a medida que es menor o mayor, la probabilidad decrece (ponele, 20% para 2 o 4, 10% para 1 y 5, 3% para 6... vos le asignas los valores que querés, fijandote siempre que los valores sumen 100%). Después lo único que hacés es generar un valor aleatorio equiprobable entre 0 y 100 con la función random() o análoga del lenguaje, y después te fijas, según el valor que tocó, cuánto generar. Si te tocó menos de 30%, generás 3 carpetas de discos, si te tocó entre 30% y 50% (un 20%), generás 2 discos, entre 50% y 70% generás 4, y así sucesivamente según el criterio que hayas determinado.
Hay un programa que nunca usé pero que escuché que te sirve para generar funciones de probabilidad en función a los datos que das como entrada (que en este caso sería, cantidad de albumes por artista), y se llama "@Risk" (lo recomendaban en la materia "Simulación" de 4º).
En otros casos, como dijo DemO, te conviene asignar una probabilidad por CADA carpeta, por ejemplo, el WinAMP, suponete que lo tiene instalado el 60% de la gente, entonces le ponés 60% de proba para aparecer.
Lo mismo podés hacer para ciertos artistas en una carpeta "Música". Cada carpeta de artista tiene una probabilidad X de aparecer, y después, la cantidad de albumes dentro la sacas con la función "GenerarAlbumes" y, dentro de cada Album, usas una "GenerarTemas" que siga un criterio similar. Algo parecido se me ocurre, por ejemplo, para generar unas carpetas para los trabajos prácticos de la facultad, ya que tenés años, adentro materias, y adentro tps.
A mí se me ocurre que, siguiendo el árbol, primero generás el root / raíz con proba de 100%, despues como dijo Dem0, ciertas carpetas las poner por default con 100% tb (o podrías asignar 80% a que es un Windows, 20% un Linux, y generar los nombres de carpetas según el que salga
), y bueno, así por cada nodo del árbol seguís agregando hijos hasta que generas sólo archivos.
Me imagino algo así:
(ojo, es puro pseudocódigo)
GenerarArchivo(...){
... // no lo pensé mucho
}
GenerarCarpeta(padre, nombre, probDeTenerCarpetasHijas){
carpeta = new carpeta()
padre.AgregarCarpeta(carpeta)
GenerarArchivos(carpeta)
if random(0..100) > probDeTenerCarpetasHijas{
GenerarSubcarpetas(carpeta)
}
}
GenerarArchivos(carpeta){
... // dependería de cada tipo de carpeta, como dijimos antes, por ejemplo, Temas
for i=0 to cantidadArchivosGeneradas-1 {
carpeta.AgregarArchivo(archivo(i))
}
}
GenerarSubcarpetas(carpeta){
... // también dependería de cada tipo de carpeta, por ejemplo, Albumes
... // En esta función se vuelve a llamar a "GenerarCarpeta" cada vez que sea necesario, y se devuleve la cantidad de generadas
for i=0 to cantidadCarpetasGeneradas-1 {
carpeta.AgregarCarpeta(carpeta(i))
}
}
Fijate que GenerarCarpeta llama (a veces, según la probabilidad que se desea) a GenerarSubcarpetas y esta llama de nuevo a GenerarCarpeta, por lo cual sigue una estructura recursiva (necesaria para armar el árbol). Esa probabilidad que se pasa de una carpeta a otra podría ir reduciendose poco a poco, para asegurarse que la estructura no anide miles de carpetas en cascasda que ya pierdan todo el sentido xD.
Bueno, lo pensé medio rápido así que capaz bardeé muy mal, pero espero estar ayudando más de lo que mareo xD...