【问题标题】:What is the best way of randomly re-arranging a list of items in c#?在 c# 中随机重新排列项目列表的最佳方法是什么?
【发布时间】:2010-09-29 21:22:26
【问题描述】:

我有一个对象列表,我想在每个请求中随机重新排序它们。这样做的最佳方法是什么?

【问题讨论】:

  • 这应该是标准 .net 类库的一部分...

标签: c# .net random


【解决方案1】:

试试这个代码here

它使用 IComparer.Compare

如果您使用generics 执行该功能,这将是一个好习惯

【讨论】:

    【解决方案2】:

    我最喜欢的洗牌解决方案是使用 N*log N 排序并传递给它一个返回随机结果的排序谓词。它有一个很好的功能,可以使用大多数语言甚至在最条纹版本中使用的构建块,只需最少的新代码即可完成。

    【讨论】:

    • 另一方面,洗牌只有 O(n) 并且只有大约 5 行代码,如其他答案所示。 (并且可以很容易地用泛型完成一次。)
    • 5 行到 1 行要么不多(只有 4 行),要么很多(80%)。也更容易记住。
    • 另一个优点是排序可能会利用某些东西在交换中获得良好的性能,因此对于小的 n 它可能会更快。
    【解决方案3】:

    看看这个很酷的 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

    【讨论】:

    • 速度不是很快,但非常棒。
    • 当你可以拿出你的大 LINQ 棒向别人展示你比他们更好时,谁在乎性能? :-P
    • 请记住,GUID 被视为用于加密目的的随机数。他们会为这种事情工作,但他们不能互换。
    • 该死的对!直到我们要求快速完成为止。
    • msdn.microsoft.com/en-us/library/… 使用类似于示例代码的类来生成加密随机数,而不是使用 NewGuid()。不过,没有关于这方面表现的消息。
    【解决方案4】:

    我将创建一个新列表,并用从原始列表中随机选择和删除的项目填充它。

    【讨论】:

      【解决方案5】:

      让我告诉你一种错误的方法,我承认我以前用过的一种方法,直到这篇博文才发现它的错误:

      http://www.codinghorror.com/blog/archives/001015.html

      【讨论】:

        【解决方案6】:

        某种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]);
        }
        

        代码取自Coding Horror。这也是一个关于人们经常犯错的推荐读物。

        【讨论】:

          【解决方案7】:

          您可以使用以线性时间运行的Fisher-Yates shuffle 算法。

          【讨论】:

          猜你喜欢
          • 2023-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-16
          • 2023-03-03
          • 1970-01-01
          • 2012-03-17
          • 1970-01-01
          相关资源
          最近更新 更多