在Ruby中编写一个shuffle方法

时间:2017-02-21 14:48:38

标签: arrays ruby shuffle

我对学习红宝石很新,我正在通过Chris Pine的学习计划工作。他建议尝试的一个练习是编写一个shuffle方法(我知道#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)

然而,考虑到它实际上做了什么,它是相当啰嗦的。我有什么方法可以改进吗?

1 个答案:

答案 0 :(得分:2)

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

除了详细程度之外,您遇到的另一个问题是您使用#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 }