我发现以下代码可以解决涉及随机化的初学者 Ruby 问题。我意识到 Ruby 有一个shuffle
方法,但是我的问题的目的是专门针对push
.
def shuffle arr
shuf = []
while arr.length > 0
# Randomly pick one element of the array.
rand_index = rand(arr.length)
# Now go through each item in the array,
# putting them all into new_arr except for the # randomly chosen one, which goes into shuf.
curr_index = 0
new_arr = []
arr.each do |item|
if curr_index == rand_index
shuf.push item
else
new_arr.push item
end
curr_index = curr_index + 1
end
# Replace the original array with the new, # smaller array.
puts arr.inspect
arr = new_arr
end
shuf
end
shuffle_array = [1,2,3,4,5,6,7,8,9]
shuffle(shuffle_array)
命令行的输出是:
Rick:programs rickthomas$ ruby shuffleSolution.rb
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 8, 9]
[1, 2, 3, 4, 5, 8, 9]
[1, 2, 3, 4, 5, 9]
[1, 2, 3, 4, 9]
[1, 3, 4, 9]
[3, 4, 9]
[3, 9]
[3]
Rick:programs rickthomas$
从这条线来看while arr.length > 0
,它似乎arr
逐渐减少,我认为这是由于来自其他两个数组中的任何一个的pushing
项目。arr
为了测试这个假设,我一直在搞乱以下代码:
array1 = [1,2,3,4,5,6,7,8]
array2 = []
array3 = []
array1.each do |x|
random_num = rand(2)
if random_num == 1
array2.push x
else
array3.push x
end
puts array1.inspect
end
我希望 array1 以与上述方法类似的方式减少shuffle
,但我得到了这个:
Rick:programs rickthomas$ ruby socratesWork.rb
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
Rick:programs rickthomas$
为什么push
删除第一个片段中的数组项,而不是第二个片段?我只是在某处遗漏了语法错误,还是我误解了一些更基本的东西push
?
我已经在 Stack Overflow 上搜索了这个问题的答案,但还没有找到类似的问题。我还查看了 ruby-doc.org,但它只讨论了添加到数组,而不是将 (?) 项从一个数组移动到另一个数组。