2010-09-19 14 views
5

मेरे पास कुछ सौ लाइनों के साथ एक टेक्स्ट फ़ाइल है, संरचना बहुत सरल है।फ़ाइल से यादृच्छिक रेखा पढ़ें? सी #

FIRSTNAME LASTNAME

मैं फ़ाइल से एक यादृच्छिक firstname & listname बाहर लेने के लिए की जरूरत है।

+0

पोस्ट करें जो आपके पास है, कृपया ... –

उत्तर

14
string[] lines = File.ReadAllLines(...); //i hope that the file is not too big 
Random rand = new Random(); 
return lines[rand.Next(lines.Length)]; 

एक और (और शायद बेहतर) विकल्प फ़ाइल की पहली पंक्ति उस में अभिलेखों की संख्या में होते हैं और फिर आप सभी फ़ाइल को पढ़ने की जरूरत नहीं है है।

+4

+1: मुझे इससे नफरत है जब लोग उन प्रश्नों का उत्तर देते हैं जो मैं वास्तव में जवाब दे सकता हूं, खासकर जब वे वास्तव में उसी कोड का उपयोग करते हैं :) –

+0

धन्यवाद, मैं बस पता लगा लिया। लेकिन आपका रास्ता बेहतर लगता है। – crap

+0

यह तब तक काम करता है जब तक फ़ाइल अपेक्षाकृत छोटी होती है। मैंने एक विकल्प प्रदान किया है जो आपको पूरी फ़ाइल को स्मृति में रखने की अनुमति नहीं देता है। – tvanfosson

11

अब तक देखी गई लाइनों की गणना, एन, प्रत्येक पंक्ति को पढ़ें। संभाव्यता 1/एन के साथ प्रत्येक पंक्ति का चयन करें, यानी, पहली पंक्ति हमेशा चुना जाएगा, दूसरी पंक्ति को पहले, तीसरे 1/3 बार प्रतिस्थापित करने के लिए 1/2 बार चुना जाएगा ... इस तरह प्रत्येक पंक्ति में एक चयनित लाइन होने की 1/एन संभावना, आपको केवल एक बार फ़ाइल को पढ़ना होगा, और आपको किसी भी समय मेमोरी में सभी फाइलों को स्टोर करने की आवश्यकता नहीं है।

यहां एक कार्यान्वयन है जिसे आपकी आवश्यकताओं के लिए अनुकूलित किया जा सकता है।

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 के आधार पर।

+0

गणित मेरे लिए गलत लग रहा है। पहली पंक्ति 1/एन का चयन करने की संभावना नहीं है! जब तक आप अंत तक पहुंच जाते हैं? –

+0

यहां गणित ठीक और अच्छा है :) –

+0

@Itay: केवल अगर आप टिप्पणियों पर विश्वास करते हैं: मैं नहीं करता हूं। लेकिन, मुझे पहले संभावना से बेवकूफ़ बना दिया गया है। –

संबंधित मुद्दे