首页 > 解决方案 > 从列表中取出 30 个随机元素

问题描述

我有一个字符串列表,其中包含大量带有文本的主题标签。ex #csharp #java 等。每个主题标签都是列表中的一个自己的字符串。我现在想随机总是 console.writeline 该列表的 30 项。

列表


List<string> Hashtags = new List<string>();

写线


 foreach (var x in Hashtags) {

                Console.WriteLine(x);
            }

理想情况下,我永远不想在随机 30 中拥有相同的主题标签。

标签: c#listrandom

解决方案


你应该试试这个:

var rnd = new Random();

foreach (var x in Hashtags.OrderBy(x => rnd.Next()).Take(30))
{
    Console.WriteLine(x);
}

这很O(n^2)复杂,但很容易阅读。

如果您想提高效率,请尝试使用 Fisher-Yates Shuffle,它是O(n),但可读性较差:

var take = 30;

var rnd = new Random();

for (var i = 0; i < (Hashtags.Count < take ? Hashtags.Count : take); i++)
{
    var j = rnd.Next(Hashtags.Count);
    (Hashtags[i], Hashtags[j]) = (Hashtags[j], Hashtags[i]);
}

foreach (var x in Hashtags.Take(take))
{
    Console.WriteLine(x);
}

但是请记住,最好Random每个线程实例化一次,所以这将是一个更好的方法:

[ThreadStatic]
private static Random rnd = new Random();

推荐阅读