November 2012
Intermediate to advanced
888 pages
54h 46m
Polish
Chcemy dokonać losowego wyboru wiersza z pliku, bez ładowania całej jego zawartości do pamięci.
Uruchamiamy iterację po wierszach pliku, dając każdemu z nich losową szansę wyboru:
module Enumerable
def random_line
selected = nil
each_with_index { |line, lineno| selected = line if rand < 1.0/lineno }
return selected.chomp if selected
end
end
# Tworzenie pliku zawierającego 1000 wierszy
open('random_line_test', 'w') do |f|
1000.times { |i| f.puts "Wiersz #{i}" }
end
# Losowy wybór wiersza z pliku
f = open('random_line_test')
f.random_line # => "Wiersz 562"
f.random_line # => nil
f.rewind
f.random_line # => "Wiersz 201"
Najbardziej oczywisty wariant losowania wiąże się ...