2012-08-02 21 views
5

यह प्रश्न मुझे एक साक्षात्कार के दौरान दिया गया था। साक्षात्कार में लंबे समय के खत्म हो गया है, लेकिन मैं अभी भी hte समस्या के बारे में सोच रहा हूँ और उसके मुझे गुस्सा दिलाना:फ़ाइल में यादृच्छिक रेखा

आप एक ऐसी भाषा है जो निम्न उपकरण शामिल हैं: एक rand() समारोह, while और for छोरों, if बयान, और एक readline() विधि (पायथन के readline() के समान)। इन उपकरणों को देखते हुए, एक एल्गोरिदम लिखें जो फ़ाइल में एक यादृच्छिक रेखा देता है। आप फ़ाइल के आकार को नहीं जानते हैं, और आप केवल एक बार फ़ाइल की सामग्री पर लूप कर सकते हैं।

+0

क्या उन्हें लौटाई गई रेखा में एक समान वितरण की आवश्यकता थी? क्योंकि यह अन्यथा करने के लिए तुच्छ होगा। – KRyan

उत्तर

7

मैं वांछित जवाब पता नहीं है, लेकिन मेरी समाधान निम्न होगा:

chosen_line = "" 
lines = 0 

while (current_line = readline()): 
    if (rand(0, lines) == 0): 
     chosen_line = current_line 

    lines++ 

return chosen_line 

संपादित करें: एक अच्छा स्पष्टीकरण क्यों यह काम करता है this comment में तैनात थे।

+1

यही वह है जिसे वे ढूंढ रहे थे। वे देखना चाहते थे कि क्या आप जानते थे कि 'एन/(एन + 1))' ''' के रूप में '1' से' पी' 'का उत्पाद '1/(पी + 1)' है। (प्रेरण द्वारा प्रदान किया जा सकता है।) –

+7

यदि आप नहीं देखते हैं कि उपरोक्त कोड क्यों काम करता है, तो इसे इस तरह से सोचें: यह पहली पंक्ति को संभावना 1 के साथ लेता है। यह एक पंक्ति के लिए सही है। दूसरी पंक्ति पर, यह आधा समय उस रेखा पर स्विच करता है, इसलिए आधे समय में पहली पंक्ति होती है, दूसरी बार आधा समय, अब तक अच्छा है। तीसरी पंक्ति पर, यह समय की तीसरी पंक्ति 1/3 लेता है। हम पहले से ही आधा शेष समय जानते हैं कि इसकी पहली पंक्ति (1/3) थी और दूसरी शेष शेष (1/3) थी। तो अभी भी तीन लाइनों के लिए अच्छा है। और इसी तरह। –

+1

@ डेविडस्वार्टज़ +1 स्पष्टीकरण की सराहना की जाती है। – Josh

0

एक विधि, एक समान वितरण की गारंटी: एक सरणी में

(1) फ़ाइल पंक्ति-दर-पंक्ति पढ़ें (या इसी तरह, जैसे अजगर list)

(2) का प्रयोग करें rand() एक का चयन करने के सरणी में 0 और सबसे बड़ी अनुक्रमणिका के बीच संख्या।

एक और, एक समान वितरण की गारंटी नहीं:

प्रत्येक पंक्ति पढ़ें। प्रत्येक पढ़ने पर, रैंड() भी कॉल करें। यदि सीमा से अधिक, रेखा वापस करें।

+3

डाउनवॉटर: समझाएं कि इस उत्तर में क्या गलत है। – Marcin

+0

वैसे मैंने डाउनवोट नहीं किया है लेकिन यह स्वीकार्य उत्तर से स्पष्ट रूप से कम है जो सरणी का उपयोग किये बिना एक समान वितरण प्राप्त करता है। और एरे उन भाषाओं की सुविधाओं में से एक नहीं थे जो ओपी ने कहा था। – jahhaj

-1

हालांकि मार्सीन के तीसरे विकल्प के समान, ल्यूक का कार्यान्वयन हमेशा पूरी फ़ाइल को पार्स करते समय पहली पंक्ति देता है।

यह होना चाहिए कुछ की तरह:

chosen_line = "" 
treshold = 90 
max = 100 

while chosen_line == "": 
    current_line = readline() 
    if (rand(0, max) > treshold): 
     chosen_line = current_line 

print chosen_line 

तुम भी मामला नहीं लाइन में चुना गया था में current_line लौट सकता है और आप पूरी फ़ाइल पढ़ें।

+2

ल्यूक का कार्यान्वयन हमेशा पहली पंक्ति नहीं लौटाता है, और यह एक समान वितरण नहीं देता है। -1। – geoffspear

+1

अब मैं ल्यूक के कोड को समझता हूं। आप अभी भी पूरी फाइल को पार्स कर रहे हैं, लेकिन समस्या में वर्णित नहीं है जैसा कि आपको टालना चाहिए। – gepatino

+1

कोई सुराग नहीं है कि फ़ाइल कितनी देर तक हो सकती है। यह पांच लाइनें हो सकती है, लेकिन पांच मिलियन भी हो सकती है। इसमें किसी प्रकार की यादृच्छिकता प्राप्त करने के लिए, आपको पूरी फ़ाइल को खोजने के लिए पढ़ना होगा। दी गई क्षमता की समस्याएं, आप इसे कितनी दूर पढ़ सकते हैं या सीमित कर सकते हैं ... लेकिन इस सवाल के बारे में कुछ भी नहीं है। – Luc

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