2012-08-02 18 views
5

Bu soru bana bir röportaj sırasında verildi. Görüşme uzun bitti, ama hala Hte sorun hakkında düşünüyorum ve onun beni rahatsız:Dosyada rastgele çizgi

Aşağıdaki araçları içeren bir dil vardır: rand() işlevi, while ve for döngüler, if ifadeler ve readline() yöntem (python’un readline()’a benzer). Bu araçlar verildiğinde, dosyaya rastgele bir satır döndüren bir algoritma yazın. Dosyanın boyutunu bilmiyorsunuz ve sadece dosyanın içeriğini bir kez değiştirebiliyorsunuz.

+0

İade edilen satırda tekdüze bir dağıtım gerektiriyor mu? Aksi takdirde yapmak için önemsiz olurdu. – KRyan

cevap

7

Ben istenen cevabı bilmiyorum, ama benim çözüm aşağıdaki olacaktır:

chosen_line = "" 
lines = 0 

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

    lines++ 

return chosen_line 

Düzenleme: Bu eserler this comment gönderilmiş neden iyi bir açıklama.

+1

Aradıkları şey bu. 'N' (n/(n + 1)) 'nin 'n' 'den' '' '' ''' '' '' '' '(1/(p + 1) 'dır) olduğunu bilip bilmediğini görmek istediler. (Endüksiyon ile elde edilebilir.) –

+7

Yukarıdaki kodun neden işe yaradığını göremiyorsanız, bu şekilde düşünün: İlk satırı olasılık 1 ile alır. Bu bir satır için doğru. İkinci satırda, bu çizgiye zamanın yarısı kadar geçer, bu yüzden ilk satırın yarısı, ikinci zamanın yarısı, şimdiye kadar iyi. Üçüncü satırda, zamanın 1/3 üçüncü çizgisini alır. Kalan sürenin yarısını zaten biliyoruz, ilk satırın (1/3) ve kalan sürenin yarısı ikinci oldu (1/3). Yani üç satır için hala iyi. Ve bunun gibi. –

+1

@DavidSchwartz +1 Açıklama takdir edilmektedir. – Josh

0

bir yöntem olup, homojen bir dağılım garanti: (bakınız, örneğin piton list veya benzeri) bir diziye

(1) dosyasını satır-satır oku

(2) rand() kullanın seçmek dizideki 0 ile en büyük dizin arasında sayı.

başka, tek tip bir dağılım garanti değil:

her satırı oku. Her okunuşta, rand() öğesini de çağırınız. Bir eşiğin üzerinde ise, çizgiyi döndürün.

+3

Downvoter: Bu cevapta neyin yanlış olduğunu açıklayın. – Marcin

+0

Peki ben aşağılamadım ama bir dizi kullanmadan düzgün bir dağıtım alır kabul edilen cevap açıkça daha düşüktür. Ve diziler OP'nin mevcut olduğu dil özelliklerinden biri değildi. – jahhaj

-1

Marcin'in üçüncü seçeneğine benzemesine rağmen, Luc'un uygulaması tüm dosyayı ayrıştırırken her zaman ilk satırı döndürür.

şey gibi olmalı: Ayrıca hiçbir satır seçildi durumunda current_line geri dönebilirler ve bütün dosyayı okumak

chosen_line = "" 
treshold = 90 
max = 100 

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

print chosen_line 

.

+2

Luc'in uygulaması her zaman ilk satırı döndürmez ve bu da tekdüze bir dağılımı sağlamaz. -1. – geoffspear

+1

Şimdi Luc'ın kodunu anlıyorum. Hala tüm dosyayı ayrışıyorsunuz, ancak sorunun içinde kaçınmanız gereken bir şey olarak açıklanmadı. – gepatino

+1

Dosyanın ne kadar uzun olabileceği konusunda bir ipucu yok. Beş hatta beş hatta olabilir. Herhangi bir rastlantısallık içine girebilmek için, öğrenmek için dosyanın tamamını okumak zorundasınız. Kapasite sorunları göz önüne alındığında, ne kadar okuduklarını sınırlandırabilirsin ... Ama bu konuda bir şey yok. – Luc