如何在C#中从字符串数组中快速获取随机值?

5

在 .net 2.0 框架下,从字符串数组中获取随机值的最快方法是什么?我想他们可能已经有了这个:

string[] fileLines = File.ReadAllLines(filePath);
fileLines.GetRandomValue();

是的,我知道GetRandomValue()不是一个真正的方法,有没有类似的东西更加简短而甜美?


你说的getrandomvalue()是什么意思?它应该返回数组中的随机一行吗? - Toad
我猜你想计算某种哈希值?请参考:http://stackoverflow.com/questions/1388702/c-md5-calculation-issue - Philippe Leybaert
6个回答

12
没有内置,但添加起来很容易...
static readonly Random rand = new Random();
public static T GetRandomValue<T>(T[] values) {
    lock(rand) {
        return values[rand.Next(values.Length)];
    }
}

如果在紧密循环中使用,static字段可以确保我们不会得到重复值,而lock可防止多个调用者对其进行修改。

在C# 3.0中,这可以是一个扩展方法:

public static T GetRandomValue<T>(this T[] values) {...}

那么您可以按照您的示例完全使用它:

string[] fileLines = File.ReadAllLines(filePath);
string val = fileLines.GetRandomValue();

另一种方法是将rand [ThreadStatic]设置为静态线程,并使用从系统时间和ThreadID派生的种子,完全避免锁定... - Pop Catalin
就我个人而言,我认为将其作为扩展方法添加有点滥用。显然,并不是所有的字符串[]数组都需要它。 - Noon Silk
1
我只是说“可能”,来说明原帖中的用法,并且扩展方法对代码性能没有累积成本。容器类可以在一个“Utils.Arrays”命名空间中,以严格限制范围。 - Marc Gravell
我知道;但我认为这是为什么扩展方法不好的典型例子:它太容易添加无用的方法来解决特定问题,而不是为整个应用程序增加新的通用功能。 - Noon Silk
这对我编写的应用程序非常有帮助,因为它需要从各种不同的列表和数组中选择随机元素;因此在那种情况下并不无用。 - Dale

1

确实。

Random m = new Random();
string line = fileLines[m.Next(0, fileLines.Length);

1

尝试:

fileLines [new Random ().Next (fileLines.Length)]

3
如果快速连续地调用此函数(例如在紧密循环内),每次都会返回相同的结果。 - LukeH

1

我认为数组不支持这样的功能。最简单的方法就是获取一个随机数,然后获取相应的项。

Random rnd = new Random();
String item = fileLines[rnd.next(fileLines.Length);

0
我会使用以下方法从数组中获取随机项:
string[] str = {"red","blue","pink","yellow","green","brown"};
int i = new Random.Next(0, str.length);
MessageBox.Show(str[i]);

0

Linq To Sql 的方式

var rFile = fileLines.OrderBy(x => Guid.NewGuid()).FirstOrDefault();

如果您看到错误,应该添加 System.Linq;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接