2010-05-25 47 views
1

如何隨機我出去的文件的順序:隨機化輸出文件夾中

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

謝謝! :-)

+0

看一看:http://stackoverflow.com/questions/1816534/random-playlist-algorithm – Oliver 2010-05-25 09:36:35

回答

5

一種選擇是使用Random

Random rng = new Random(); 

然後:

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

這不是最有效的方法,因爲它需要O(nlogn)。如果這對你來說是一個問題,那麼存在更好的算法。

2

如果你不能使用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

又名[費 - 耶茨洗牌](http://en.wikipedia.org/wiki/Fisher% E2%80%93Yates_shuffle) - 這可以在原地完成(和你一樣),哈O(n)的複雜性。 – Kobi 2010-05-25 09:37:22

0
  1. 遍歷源列表。
  2. 從源列表中一個結果列表,直到源列表中刪除隨機源項
  3. 追加刪除項目
  4. 重複是空

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; 

2

Fisher-Yates-Durstenfeld shuffle爲O(n)並應給予公正的分配。

創建一個幫助/擴展方法來perform an in-place shuffle在陣列從GetFiles返回:

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

如果你喜歡返回一個新的序列 - 點菜LINQ - 你可以創建一個合適的替代Shuffle extension method

// uses Shuffle extension from https://stackoverflow.com/a/1653204/55847 
var sequenceOfFiles = Directory.EnumerateFiles("folder").Shuffle();