从列表中选取30个随机元素

Mis*_*orf 0 c# random list

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

清单


List<string> Hashtags = new List<string>();
Run Code Online (Sandbox Code Playgroud)

写线


 foreach (var x in Hashtags) {

                Console.WriteLine(x);
            }
Run Code Online (Sandbox Code Playgroud)

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

Eni*_*ity 5

您应该尝试这样:

var rnd = new Random();

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

这具有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);
}
Run Code Online (Sandbox Code Playgroud)

不过请记住,最好Random每个线程实例化一次,因此这是一个更好的方法:

[ThreadStatic]
private static Random rnd = new Random();
Run Code Online (Sandbox Code Playgroud)