在 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 }
我对学习 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 }