100.times { puts Benchmark.measure { lines = [] IO.readlines(ARGV[0]).each {|line| word, probability = line.split(/\s+/) lines << {:word => word, :probability => probability.to_f} } words = [] (ARGV[1] ? ARGV[1].to_i : 1).times { random_probability = rand() cumulative_probability = 0 lines.each {|line| cumulative_probability += line[:probability] if cumulative_probability > random_probability words << line[:word] break end } } } }