He visto algunos ejemplos realmente hermosos de Ruby y estoy tratando de cambiar mi forma de pensar para poder producirlos en lugar de solo admirarlos. Esto es lo mejor que podía llegar a para recoger una línea aleatoria de un archivo:Ruby: ¿Cuál es una manera elegante de elegir una línea al azar de un archivo de texto?
def pick_random_line
random_line = nil
File.open("data.txt") do |file|
file_lines = file.readlines()
random_line = file_lines[Random.rand(0...file_lines.size())]
end
random_line
end
me siento como que tiene que ser posible hacer esto de una manera más corta, más elegante sin almacenar los contenidos de todo el archivo en la memoria . ¿Esta ahí?
¿Se trata más de una pregunta "¿cómo hago esto _en Ruby_", o más de una pregunta "¿cómo hago esto _en menos de O (N) espacio_"? Si es este último, investigue [muestreo de yacimientos] (http://gregable.com/2007/10/reservoir-sampling.html). – zwol
mi implementación trivial sería buscar una posición aleatoria en el archivo y luego buscar hacia adelante una nueva línea –
@SamSaffron Eso no le dará una línea uniformemente al azar a menos que todas las líneas sean exactamente de la misma longitud. – zwol