0

ここでArray#shuffle!、配列オブジェクトがどのように機能するかを確認しようとしていました。だから私は私の中でそれで遊んで始めましたIRB:

[1,2,3]
#=> [1, 2, 3]
[1,2,3].shuffle!
#=> [3, 1, 2]

上記のコードでは、それがどのように機能するかを理解しました。そして、以下は、隅々から見るのが難しい方法でそれをいじろうとしていました.

[1,2,5]
#=> [1, 2, 5]
[1,2,5]<<[1,2,5]
#=> [1, 2, 5, [1, 2, 5]]

今まで私は元気です。

[1, 2, 5, [1, 2, 5]].shuffle!
#=> [5, 1, 2, [1, 2, 5]]

上記のコードでは混乱があります。それで、以下の質問が頭に浮かびました:

  • (a)shuffle!再帰的に機能しないのはなぜですか? 予想通り、内側の配列の出力[1, 2, 5]もシャッフルされます。しかし、起こらなかった。

  • (b)shuffle!要素配列をシャッフルせず、配列の要素[1, 2, 5]のみで動作するのはなぜですか? 出力は次のようになると思いました。では、なぜ要素配列はその位置を変更せず、通常の要素だけを変更したのでしょうか?1, 2, 5,[1, 2, 5, [1, 2, 5]][[1, 2, 5],5, 1, 2]

編集:

それが示している非常に興味深い動作:

a=[1,2,4]
#=> [1, 2, 4]
a<<[7,8]
#=> [1, 2, 4, [7, 8]]
a.shuffle!
#=> [[7, 8], 1, 4, 2]
a.shuffle!
#=> [4, 1, [7, 8], 2]
a.shuffle!
#=> [[7, 8], 2, 1, 4]
irb(main):006:0>

シャッフルは本当に任意の順序に従っていますか、それともランダムなシャッフルですか?

4

5 に答える 5

2

a)shuffle!配列内のオブジェクトの順序を変更します。これは任意のコレクションである可能性があるため、メソッドは内部のものもシャッフルできる、またはシャッフルする必要があると想定できません。

b) この質問が a) とどのように違うのかよくわかりません。あなたが混乱していると思われることをもっと説明していただけますか?

于 2013-02-21T09:09:34.573 に答える
2

a) なぜshuffle!再帰的に動作するのでしょうか? 渡されたオブジェクトに作用します。これは、例では4つのアイテムの配列です-それらをシャッフルします。それらの1つが配列であるという事実は、ここでもそこでもありません。そのうちの1つは、気にするすべてのロバになる可能性があります。

b) 配列要素をシャッフルします。小さな IRB テストを複数回試して、配列が偶然に移動しないことがわかったはずです。

あなたの編集に関して、ここで正確に何を表示しようとしていますか?興味深い動作はまったく見られませんか? パターンはなく、シャッフルは疑似ランダムです。

于 2013-02-21T09:09:44.210 に答える
0
a=[1,2,4]
#=> [1, 2, 4]
a<<[7,8]

a.each_with_index do |element, index|

  puts "Index: #{index} element: #{element}"
end

新しいオブジェクトを配列a<<[7,8]に追加します。aこのオブジェクトには一意のインデックスがあります。シャッフル メソッドは、その目的のためにこのインデックスを使用します。

Index: 0 element: 1
Index: 1 element: 2
Index: 2 element: 4
Index: 3 element: [7, 8]

追加された配列[7,8]は 1 つのオブジェクトと見なされるため、その中の要素は配列の要素としてシャッフルされませんa

于 2013-02-21T14:15:10.013 に答える
0

配列を再帰的にシャッフルしたい場合は、問題ありません。

# encoding: utf-8

a = [1,2,3]
a << [6,7,8]

class Array
  alias shuffle_orig shuffle
  def shuffle
    self.shuffle_orig.map { |e| e.respond_to?(:shuffle) ? e.shuffle : e }
  end
end


3.times do
  p a.shuffle
end

結果は次のとおりです。

#⇒ [2, [8, 6, 7], 3, 1]
#⇒ [3, 1, [7, 6, 8], 2]
#⇒ [1, [8, 7, 6], 3, 2]

bang バージョンも同様にモンキー パッチが適用されている可能性があります。

于 2013-02-21T10:54:39.573 に答える