मेरे पास कुछ सौ लाइनों के साथ एक टेक्स्ट फ़ाइल है, संरचना बहुत सरल है।फ़ाइल से यादृच्छिक रेखा पढ़ें? सी #
FIRSTNAME LASTNAME
मैं फ़ाइल से एक यादृच्छिक firstname & listname बाहर लेने के लिए की जरूरत है।
मेरे पास कुछ सौ लाइनों के साथ एक टेक्स्ट फ़ाइल है, संरचना बहुत सरल है।फ़ाइल से यादृच्छिक रेखा पढ़ें? सी #
FIRSTNAME LASTNAME
मैं फ़ाइल से एक यादृच्छिक firstname & listname बाहर लेने के लिए की जरूरत है।
string[] lines = File.ReadAllLines(...); //i hope that the file is not too big
Random rand = new Random();
return lines[rand.Next(lines.Length)];
एक और (और शायद बेहतर) विकल्प फ़ाइल की पहली पंक्ति उस में अभिलेखों की संख्या में होते हैं और फिर आप सभी फ़ाइल को पढ़ने की जरूरत नहीं है है।
+1: मुझे इससे नफरत है जब लोग उन प्रश्नों का उत्तर देते हैं जो मैं वास्तव में जवाब दे सकता हूं, खासकर जब वे वास्तव में उसी कोड का उपयोग करते हैं :) –
धन्यवाद, मैं बस पता लगा लिया। लेकिन आपका रास्ता बेहतर लगता है। – crap
यह तब तक काम करता है जब तक फ़ाइल अपेक्षाकृत छोटी होती है। मैंने एक विकल्प प्रदान किया है जो आपको पूरी फ़ाइल को स्मृति में रखने की अनुमति नहीं देता है। – tvanfosson
अब तक देखी गई लाइनों की गणना, एन, प्रत्येक पंक्ति को पढ़ें। संभाव्यता 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 के आधार पर।
गणित मेरे लिए गलत लग रहा है। पहली पंक्ति 1/एन का चयन करने की संभावना नहीं है! जब तक आप अंत तक पहुंच जाते हैं? –
यहां गणित ठीक और अच्छा है :) –
@Itay: केवल अगर आप टिप्पणियों पर विश्वास करते हैं: मैं नहीं करता हूं। लेकिन, मुझे पहले संभावना से बेवकूफ़ बना दिया गया है। –
पोस्ट करें जो आपके पास है, कृपया ... –