随机洗牌列表[重复]

Posted

技术标签:

【中文标题】随机洗牌列表[重复]【英文标题】:Randomly shuffle a List [duplicate] 【发布时间】:2012-08-29 14:16:58 【问题描述】:

可能重复:Randomize a List<T> in C#shuffle (rearrange randomly) a List<string>Random plot algorithm

您好,我有以下列表,我想将model 输出到列表中,但这样做是随机的。我看过一些例子,但它们似乎真的很令人困惑。我只是想要一个简单的方法来做到这一点?

List<Car> garage ----randomise------> List<string> models


List<Car> garage = new List<Car>();

garage.Add(new Car("Citroen", "AX"));
garage.Add(new Car("Peugeot", "205"));
garage.Add(new Car("Volkswagen", "Golf"));
garage.Add(new Car("BMW", "320"));
garage.Add(new Car("Mercedes", "CLK"));
garage.Add(new Car("Audi", "A4"));
garage.Add(new Car("Ford", "Fiesta"));
garage.Add(new Car("Mini", "Cooper"));

【问题讨论】:

Randomize a List<T> in C# 或 Shuffle List<T> 或 ... 的可能副本 【参考方案1】:

我想你想要的就是这个,这是一种简单的方法;

Random rand = new Random();
var models = garage.OrderBy(c => rand.Next()).Select(c => c.Model).ToList();

//模型假设这是您的属性的名称

注意:具有讽刺意味的是,Random() 实际上并不是很随机,但对于一个快速简单的解决方案来说很好。有更好的算法可以做到这一点,这里有一个可以看看;

http://en.wikipedia.org/wiki/Fisher-Yates_shuffle

【讨论】:

Why does using Random in Sort causing [Unable to sort IComparer.Compare error 它的复杂度是N*LogN,而它可以在N中完成 @saj 简单与否,这是一个不应该使用的糟糕解决方案。当一个奇妙的解决方案已经如此简单时,为什么还要传播一个糟糕的解决方案。 @PeterCrouch 问题不是“真正的随机性”。上面的代码可能永远运气不好:) 因此,如果代码可能无法完成,可能会引发异常,实际上随机排序数据的可能性要小得多,并且需要更长的时间,因此值得为您节省大约 3 行代码(假设任何解决方案都会无论如何,仍然只是从其他地方复制粘贴)。抱歉,但是保存几行我什至不必编写的代码对我来说不值得,而且出于这些原因,我不能凭良心向...任何人建议它。还要记住最后的 SO 问题;你不只是把它给一个人。这个问题可能会在 SO 上停留一段时间,然后被其他人看到。【参考方案2】:

我已经看到一些关于这个 pre-LINQ 的混乱代码,但是 LINQ 的方式看起来很干净。

也许试试这个?

http://www.ookii.org/post/randomizing_a_list_with_linq.aspx

Random rnd = new Random();
var randomizedList = from item in list
                     orderby rnd.Next()
                     select item;

【讨论】:

Why does using Random in Sort causing [Unable to sort IComparer.Compare error 坏主意,见 cmets here.

以上是关于随机洗牌列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

同时不改变循环外变量的值。我需要制作一种以随机方式对数组进行洗牌的方法。 (C#请)[重复]

在重复迭代期间更有效的洗牌

常用算法篇-洗牌算法

问题列表

Python中的键控随机洗牌

数组洗牌算法-shuffle