[英]What is the best way of randomly re-arranging a list of items in c#?
我有一個對象列表,我想在每個請求上隨機重新排序。 這樣做的最佳方式是什么?
某種Knuth-Fisher-Yates shuffle算法怎么樣?
for (int i = cards.Length - 1; i > 0; i--)
{
int n = rand.Next(i + 1);
Swap(ref cards[i], ref cards[n]);
}
代碼取自Coding Horror 。 這也是關於人們經常如何做錯的推薦讀物。
看看這個酷炫的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();
您可以使用以線性時間運行的Fisher-Yates shuffle算法。
讓我指導你做一個錯誤的做法,以及我以前認可的方式,直到這篇博文發表之前從未見過它的錯誤:
我最喜歡的改組解決方案是使用N * log N sort並傳遞一個返回隨機結果的排序謂詞。 它具有很好的功能,可以使用最少的新代碼來完成,使用構建塊,即使是最條紋的版本,大多數語言都可以使用它。
我將創建一個新的列表,並用隨機選擇並從原始列表中刪除的項目填充它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.