2009-01-06 35 views

回答

1

我最喜歡的洗牌方案是使用N * log N sort並將它傳遞給一個返回隨機結果的排序謂詞。它具有很好的功能,可以用最少的新代碼來完成,使用大多數語言即使在最條紋版本中也可以使用的構建塊。

+0

功能在另一方面,洗牌只有O(n),並且只有大約5行代碼,如其他答案所示。 (使用泛型可以輕鬆完成一次)。 – 2009-01-06 20:09:48

+0

5行到1行不是太多(只有4行)或很多(80%)。記住它也更簡單。 – BCS 2009-01-06 20:15:26

+0

另一個好處是,這種排序可能會利用某些東西在交換中獲得良好的性能,所以對於小的n它可能會更快。 – BCS 2009-01-06 20:17:02

2

您可以使用線性時間運行的Fisher-Yates shuffle算法。

+0

產生不正確的結果 - 請參閱http://www.codinghorror.com/blog/archives/001015.html – 2009-01-06 19:57:40

+0

@LFSR:再次閱讀文章? – Jimmy 2009-01-06 20:04:59

0

我會創建一個新的列表,並填寫隨機選擇並從原始列表中刪除的項目。

6

退房做的這涼爽的LINQ方式:

public class Employee 
{ 
    public int Id 
    { 
     get; 
     set; 
    } 
    public string Name 
    { 
     get; 
     set; 
    } 
} 

填充列表:

List<Employee> list = new List<Employee>(); 

    list.Add(new Employee { Id = 1, Name = "Davolio Nancy" }); 
    list.Add(new Employee { Id = 2, Name = "Fuller Andrew" }); 
    list.Add(new Employee { Id = 3, Name = "Leverling Janet" }); 
    list.Add(new Employee { Id = 4, Name = "Peacock Margaret" }); 
    list.Add(new Employee { Id = 5, Name = "Buchanan Steven" }); 
    list.Add(new Employee { Id = 6, Name = "Suyama Michael" }); 
    list.Add(new Employee { Id = 7, Name = "King Robert" }); 
    list.Add(new Employee { Id = 8, Name = "Callahan Laura" }); 
    list.Add(new Employee { Id = 9, Name = "Dodsworth Anne" }); 

然後排序:

list = list.OrderBy(emp => Guid.NewGuid()).ToList(); 

Credit

0

嘗試這種合作德here

它使用IComparer.Compare

這將是一個很好的做法,如果你做使用generics

相關問題