Рандомизировать вывод файлов в папку - PullRequest
1 голос
/ 25 мая 2010

Как мне рандомизировать порядок файлов, из которых я получаю:

string[] files = Directory.GetFiles("folder");

Спасибо! : -)

Ответы [ 4 ]

5 голосов
/ 25 мая 2010

Один из вариантов - использовать Random:

Random rng = new Random();

и затем:

var randomOrderFiles = files.OrderBy(f => rng.Next());

Это не самый эффективный метод, так как он требует O (nlogn). Если это проблема для вас, существуют лучшие алгоритмы.

2 голосов
/ 25 мая 2010

A shuffle Фишера-Йейтса-Дюрстенфельда равно O (n) и должно давать несмещенное распределение.

Создание вспомогательного метода / метода расширения для выполнения перемешивания на месте в массиве, возвращаемом из GetFiles:

// uses ShuffleInPlace extension from https://stackoverflow.com/a/5589250/55847
var arrayOfFiles = Directory.GetFiles("folder");
arrayOfFiles.ShuffleInPlace();

Если вы предпочитаете возвращать новую последовательность - например, LINQ - вы можете создать подходящий Shuffle метод расширения вместо этого:

// uses Shuffle extension from https://stackoverflow.com/a/1653204/55847
var sequenceOfFiles = Directory.EnumerateFiles("folder").Shuffle();
2 голосов
/ 25 мая 2010

Если вы не можете использовать Linq, должен работать следующий метод:

static Random rand = new Random();
static void Randomize<T>(IList<T> list)
{
    for (int i = list.Count - 1; i > 0; i--)
    {
        int i2 = rand.Next(i + 1);
        if (i2 != i)
        {
            T tmp = list[i2];
            list[i2] = list[i];
            list[i] = tmp;
        }
    }
}
0 голосов
/ 25 мая 2010
  1. Перебор списка источников.
  2. Удалить случайный источник из списка источников
  3. Добавить удаленный элемент в список результатов
  4. Повторяйте, пока список источников не станет пустым

</p> <pre><code>List<string> files = Directory.GetFiles("folder"); List<string> result = new List<string>(); while (files.Count > 0) { int n = IntegerUtility.Random(files.Count); string file = files.Remove(n); result.Add(file); } return result;

...