2

我发现以下代码可以解决涉及随机化的初学者 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,但它只讨论了添加到数组,而不是将 (?) 项从一个数组移动到另一个数组。

4

3 回答 3

2

好吧,您正在将除具有匹配索引的元素之外的所有元素推送到new_arr. 它的大小在每次迭代中减一。

于 2013-03-23T11:32:46.523 回答
1

似乎您在每次迭代时都用一个较小的数组替换了您的数组。

 # Replace the original array with the new, # smaller array.
    puts arr.inspect
    arr = new_arr
于 2013-03-23T11:20:47.077 回答
1

在您的第一个片段中,内部循环将原始数组拆分arr为 2 部分:

  1. 匹配随机索引的元素,并将其压入数组shuf
  2. 那些与随机索引不匹配的元素,它们被推入new_arr,在每个外循环中初始化为空数组。

因此,在每个外部循环中,shuf再获取一个元素,并new_arr接收arr除随机选择的元素之外的所有元素。MAGIC出现在外循环的最后一行,分配new_arrarr. 所以每个循环都会arr变小一个元素。这不是Array#push.

于 2013-03-23T12:22:39.010 回答