ランダム化を含む初心者の 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
が徐々に減少しているように見えます。これは、他の 2 つの配列のいずれかへの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
最初のスニペットでは配列項目を削除するのに、2 番目のスニペットでは削除しないのはなぜですか? どこかで構文エラーを見逃しているだけですか、それとももっと基本的なことを誤解していpush
ますか?
この質問に対する回答を既にスタック オーバーフローで検索しましたが、投稿された同様の質問はまだ見つかりませんでした。ruby-doc.org もチェックしましたが、配列への追加についてのみ説明されており、ある配列から別の配列へのアイテムの移動 (?) については言及されていませんでした。