【发布时间】:2010-09-19 13:52:31
【问题描述】:
我有一个几百行的文本文件,结构很简单。
名字姓氏
我需要从文件中随机挑选一个名字和列表名。
【问题讨论】:
-
请发布您现在拥有的...
我有一个几百行的文本文件,结构很简单。
名字姓氏
我需要从文件中随机挑选一个名字和列表名。
【问题讨论】:
string[] lines = File.ReadAllLines(...); //i hope that the file is not too big
Random rand = new Random();
return lines[rand.Next(lines.Length)];
另一个(也许更好)的选择是让文件的第一行包含其中的记录数,然后您就不必阅读所有文件。
【讨论】:
阅读每一行,记下你目前看到的行数 N。以 1/N 的概率选择每一行,即始终选择第一行,第二行将被选择 1/2 次替换第一行,第三行 1/3 次,... 这样每行都有一个被选中行的概率为 1/N,您只需读取文件一次,无需在任何给定时间将所有文件存储在内存中。
这是一个可以根据您的需要进行调整的实现。
public string RandomLine( StreamReader reader )
{
string chosen = null;
int numberSeen = 0;
var rng = new Random();
while ((string line = reader.ReadLine()) != null)
{
if (rng.NextInt(++numberSeen) == 0)
{
chosen = line;
}
}
return chosen;
}
基于C implementation 从任意长的链表中选择一个节点。
【讨论】: