在 Ruby 中编写随机播放方法

Writing a shuffle method in Ruby

我对学习 ruby 还很陌生,我正在学习 Chris Pine 的《学习编程》。他建议尝试的练习之一是编写随机播放方法(我知道 #shuffle 方法)。到目前为止,我已经想出了这段代码,它似乎可以完成这项工作:

array_to_shuffle = []
puts "Give me a list of words to shuffle, press enter on an empty line for the result."
input = gets.chomp

while input != ""
  array_to_shuffle = array_to_shuffle.push(input)
  input = gets.chomp
end

def recursive_shuffle(array_to_shuffle, shuffled_array = [])
  return shuffled_array unless array_to_shuffle.size > 0
  array_size = array_to_shuffle.size()
  random_number = rand(1..array_size)-1
  element_transfered = array_to_shuffle [random_number]
  shuffled_array = shuffled_array.push(element_transfered)
  array_to_shuffle.delete(element_transfered)
  recursive_shuffle(array_to_shuffle, shuffled_array)
end

puts recursive_shuffle(array_to_shuffle)

但是,考虑到它的实际作用,这是相当冗长的。有什么办法可以改进吗?

你的想法是随机选择元素,直到你选择了所有元素。

除了冗长之外,您遇到的另一个问题是您使用 #delete。因此,如果数组中有两个重复元素,则在打乱后的结果中只会得到一个。

您还改变了传递的数组,这通常是不可取的。这是相同算法的实现:

def recursive_shuffle(to_shuffle, shuffled = [])
  return shuffled if to_shuffle.empty?
  to_shuffle = to_shuffle.dup if shuffled.empty?

  element = to_shuffle.sample
  to_shuffle.delete_at(to_shuffle.index(element))

  recursive_shuffle(to_shuffle, shuffled + [element])
end

至于更简单的解决方案:

array.sort_by { rand }