Birkaç yüz satırlık bir metin dosyam var, yapı oldukça basit. Ben dosyadan rasgele ad & ListName seçmek gerekirBir dosyadan rastgele satır mı okuyorsunuz? C#
ad lastname.
Birkaç yüz satırlık bir metin dosyam var, yapı oldukça basit. Ben dosyadan rasgele ad & ListName seçmek gerekirBir dosyadan rastgele satır mı okuyorsunuz? C#
ad lastname.
string[] lines = File.ReadAllLines(...); //i hope that the file is not too big
Random rand = new Random();
return lines[rand.Next(lines.Length)];
başka (ve belki daha iyi) seçeneğini dosyasının ilk satırı içinde kayıt sayısını içeren ve daha sonra da tüm dosya okumak gerekmez sahip olmaktır.
+1: İnsanlar gerçekten soruları cevaplayabildiğimde nefret ediyorum, özellikle de tam olarak aynı kodu kullandıklarında cevap verebildim :) –
Teşekkürler, sadece bunu anladım. Ama senin yolun daha iyi görünüyor. – crap
Dosya nispeten küçük olduğu sürece çalışır. Tüm dosyayı hafızada tutmanıza gerek kalmayacak bir alternatif sağladım. – tvanfosson
Şimdiye kadar gördüğünüz satırların sayım N sayımını her satırı okuyun. 1/N olasılıklı her satırı seçin, yani, ilk satır her zaman seçilecektir, ikinci satır, ilk, üçüncü 1/3 kez değiştirmek için 1/2 kez seçilecektir. 1/N seçili satır olma olasılığı, sadece dosyayı bir kez okumalısınız ve tüm dosyaları herhangi bir zamanda belleğe kaydetmeniz gerekmiyor.
İşte ihtiyaçlarınız için uyarlanabilen bir uygulama.
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;
}
isteğe bağlı olarak uzun bağlantılı liste bir düğüm seçmek için bir
C implementation dayanmaktadır.
matematik bana yanlış görünüyor. İlk satırın 1/n seçilmesi ihtimali yok! sonuna kadar aldığın zaman? –
Buradaki matematik güzel ve güzel :) –
@Itay: Sadece yorumlara inanıyorsanız: Ben yapmam. Ama daha önce olasılıktan kandırdım. –
Şimdi sahip olduklarınızı gönderin, lütfen ... –