2010-09-19 53 views

cevap

14
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.

+4

+1: İnsanlar gerçekten soruları cevaplayabildiğimde nefret ediyorum, özellikle de tam olarak aynı kodu kullandıklarında cevap verebildim :) –

+0

Teşekkürler, sadece bunu anladım. Ama senin yolun daha iyi görünüyor. – crap

+0

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

11

Ş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.

+0

matematik bana yanlış görünüyor. İlk satırın 1/n seçilmesi ihtimali yok! sonuna kadar aldığın zaman? –

+0

Buradaki matematik güzel ve güzel :) –

+0

@Itay: Sadece yorumlara inanıyorsanız: Ben yapmam. Ama daha önce olasılıktan kandırdım. –

İlgili konular