Tôi có một danh sách các đối tượng và tôi muốn sắp xếp lại chúng một cách ngẫu nhiên trên mỗi yêu cầu. Cách nào là tốt nhất để thực hiện việc này?Cách tốt nhất để sắp xếp lại ngẫu nhiên danh sách các mục trong C# là gì?
Trả lời
Làm thế nào về một số loại Knuth-Fisher-Yates shuffle algorithm?
for (int i = cards.Length - 1; i > 0; i--)
{
int n = rand.Next(i + 1);
Swap(ref cards[i], ref cards[n]);
}
Mã lấy từ Coding Horror. Đây cũng là một đề nghị đọc về cách mọi người thường làm điều này sai.
Giải pháp yêu thích của tôi để xáo trộn nội dung là sử dụng N * log N sắp xếp và chuyển cho nó một biến vị ngữ sắp xếp trả về kết quả ngẫu nhiên. Nó có tính năng tốt đẹp có thể được thực hiện với tối thiểu mã mới bằng cách sử dụng các khối xây dựng mà hầu hết các ngôn ngữ có ích ngay cả trong các phiên bản sọc nhất.
Trên Mặt khác, shuffle chỉ là O (n) và chỉ có khoảng 5 dòng mã, như được hiển thị trong các câu trả lời khác. (Và có thể được thực hiện chỉ một lần với generics rất dễ dàng.) –
5 dòng đến 1 dòng hoặc là không nhiều (chỉ có 4 dòng) hoặc rất nhiều (80%). Nó cũng đơn giản hơn để nhớ. – BCS
Và lợi thế khác là việc sắp xếp có thể tận dụng một cái gì đó để có được sự hoàn hảo tốt trên các giao dịch hoán đổi để nhỏ n nó có thể nhanh hơn. – BCS
Bạn có thể sử dụng thuật toán Fisher-Yates shuffle chạy trong thời gian tuyến tính.
Tạo kết quả không chính xác - xem http://www.codinghorror.com/blog/archives/001015.html –
@LFSR: đọc lại bài viết? – Jimmy
Còn về Knuth? :( – configurator
Hãy để tôi hướng dẫn bạn đến một WRONG cách để làm việc đó, và là một cách tôi thú nhận tôi đã sử dụng trước đó, và không bao giờ nhìn thấy lỗi của nó cho đến khi bài đăng blog:
Điều đó cũng cho thấy cách * đúng * để làm điều đó :) –
tôi sẽ tạo một Danh sách mới và điền vào nó với các mục được chọn ngẫu nhiên và xóa khỏi Danh sách gốc.
Check-out này LINQ cách mát mẻ để làm việc đó:
public class Employee
{
public int Id
{
get;
set;
}
public string Name
{
get;
set;
}
}
cư một danh sách:
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" });
Sau đó sắp xếp:
list = list.OrderBy(emp => Guid.NewGuid()).ToList();
Không chính xác nhanh, nhưng friggen tuyệt vời. – Will
Ai quan tâm đến hiệu suất khi bạn có thể roi ra thanh LINQ lớn của bạn và hiển thị những người khác bạn tốt hơn họ? :-P – BFree
Chỉ cần nhớ rằng GUID's ** NOT ** được coi là số ngẫu nhiên cho mục đích mã hóa. Họ sẽ làm việc cho loại điều này, nhưng họ không thể hoán đổi cho nhau. –
- 1. Cách tốt nhất để sắp xếp danh sách với các tham số sắp xếp tùy chỉnh bằng Python là gì?
- 2. Các yếu tố xáo trộn trong danh sách (sắp xếp lại các yếu tố danh sách ngẫu nhiên)
- 3. Cách hiệu quả nhất để ngẫu nhiên "sắp xếp" (Trộn) một danh sách các số nguyên trong C#
- 4. Sắp xếp lại một danh sách các mục vị trí
- 5. Cách tốt nhất để phân ngẫu nhiên danh sách các chuỗi trong Python
- 6. Sắp xếp các mục trong hộp danh sách trong C#
- 7. C++: Cách nhanh nhất để sắp xếp danh sách số và chỉ mục của chúng
- 8. Sao chép các mảng sắp xếp ngẫu nhiên
- 9. Cách pythonic nhất để bật một phần tử ngẫu nhiên từ danh sách là gì?
- 10. Cách sắp xếp danh sách các chuỗi?
- 11. Cách tốt nhất để lưu trữ danh sách được sắp xếp trong cơ sở dữ liệu là gì?
- 12. python sắp xếp ngẫu nhiên các mục có cùng giá trị
- 13. Cách tốt nhất để sắp xếp lại một ArrayList trong Java
- 14. javascript - ngẫu nhiên danh sách HTML yếu tố để
- 15. Sắp xếp lại một danh sách lệnh
- 16. Cách tốt nhất để tìm kiếm giá trị bão hòa trong danh sách được sắp xếp
- 17. Cách tốt nhất để trả về hai danh sách trong C# là gì?
- 18. Cách tốt nhất để tạo ra một khóa ngẫu nhiên trong PHP là gì?
- 19. Sắp xếp lại danh sách dựa trên thứ tự nhất định trong C#
- 20. Cách tốt nhất để sao chép danh sách là gì?
- 21. Truy cập mục ngẫu nhiên trong danh sách
- 22. Cách tốt nhất để sắp xếp một hashtable theo giá trị là gì?
- 23. Biểu diễn tốt nhất về danh sách được sắp xếp trong cơ sở dữ liệu?
- 24. Sắp xếp danh sách trong Prolog
- 25. Cách dễ nhất để tạo số ngẫu nhiên bán trong C# là gì?
- 26. Xem lại mã Java: Hợp nhất các danh sách được sắp xếp thành một danh sách được sắp xếp duy nhất
- 27. sắp xếp lại các yếu tố danh sách - jQuery?
- 28. Cách tốt nhất để sắp xếp một mảng dựa trên giao diện trong WCF là gì?
- 29. Cách tốt nhất để chọn một bàn chải ngẫu nhiên từ bộ sưu tập Brushes trong C# là gì?
- 30. Cách sắp xếp các mục trong ToolStripItemCollection?
Điều này thực sự phải là một phần của thư viện lớp .net tiêu chuẩn ... – Pyrolistical