2007年12月18日

[ruby-list:44355] Re: 配列のシャッフル

たけ(tk)です

[ruby-list:44352] 配列のシャッフル にて
Maehara Masahide (前原正英) <maehrm@xxxxx> さん曰く:

> class Array
> def randomize!
> result = collect { slice!(rand(length)) }

> replace result
> end

これだとslice!で自分を破壊しながらcollectで集めていますね。

slice!(n)はn番目の要素を抜き去って、自分自身を抜き去った後の状態に変更
するので、だんだん自分自身の要素数が減るわけですね。

collectは要素の0番目から順番にブロックに送るわけですが、要素数が減って
いくと、その位置の要素がなくなった時点でメソッドの実行をやめてしまうので
はないでしょうか?

def randomize!
result = collect {|i| p [:self,i,self]; slice!(rand(length)) }
replace result
end

[:self, 1, [1, 2, 3, 4, 5]] → 2 が抜けた [1,3,4,5]
[:self, 3, [1, 3, 4, 5]] → 4 が抜けた [1,3,5]
[:self, 5, [1, 3, 5]] → 3 が抜けた [1,5]
[2, 4, 3]


それにたいして

def shuffle
arr = dup
collect{ arr.slice!(rand(arr.length)) }
end

であれば、arr の要素数は減っていきますが、collectのレシーバであるselfの
要素数に変化はないので、期待した回数のブロックが呼ばれます。

Take_tk = KUMAGAI Hidetake
たけ(tk)=熊谷秀武


投稿者 xml-rpc : 2007年12月18日 10:46
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/67801
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。