Estoy buscando una manera de seleccionar aleatoriamente un archivo de un árbol de directorios de manera que cada archivo individual tenga exactamente la misma probabilidad de ser elegido como todos los otros archivos. Por ejemplo, en el siguiente árbol de archivos, cada archivo debe tener una probabilidad del 25% de ser elegido:Selección aleatoria de un archivo de un árbol de directorios de manera completamente equitativa
- /some/padre/dir/
- foo.jpg
- sub_dir/
- bar.jpg
- Baz.jpg
- another_sub/
- qux.png
Mi solución provisional que estoy usando mientras codificar el resto de la aplicación es tener una función de este modo:
def random_file(dir):
file = os.path.join(dir, random.choice(os.listdir(dir)));
if os.path.isdir(file):
return random_file(file)
else:
return file
Sin embargo, esto sesga, obviamente, el resultados dependiendo de dónde están en el árbol y cuántos hermanos están al lado de ellos en su directorio para que terminen con las siguientes probabilidades de ser seleccionado:
- /some/padre/dir/
- foo.jpg - 50%
- sub_dir/(50%)
- Bar.jpg - 16,6%
- Baz.jpg - 16,6%
- another_sub/(16,6%)
- qux.png - 16,6%
El contexto de la función es una aplicación en la rotación de fondo que estoy escribiendo, por lo que la capacidad de filtrar las extensiones de archivos no deseados de estar en los resultados sería un bono (a pesar de que podría simplemente vigor que al elegir de nuevo si no es el tipo de archivo que quiero ... que se vuelve complicado si hay una gran cantidad de archivos del tipo "incorrecto", sin embargo).
¿Quieres todas las imágenes estén en un "ejecutar" una vez? Podría simplemente iterar a través de todos los archivos, agregarlos a una lista y mezclar esa lista una vez. – Jacob
@Graham, +1 buena pregunta – nsd