From: Maehara Masahide (=?iso-2022-jp?B?GyRCQTA4NkA1MVEbKEI=?=) Date: 2007-12-18T11:22:52+09:00 Subject: [ruby-list:44357] Re: 配列のシャッフル 前原です。 永井さん,ありがとうございす。 On Tue, 18 Dec 2007 10:36:45 +0900, "Takehiro Nagai" wrote: > これは、collectと、slice!、lengthのレシーバが全てselfのためかと思います。 > collectは、selfの長さ分処理を繰り返します。 > しかし、下記のコードですと、collect内でslice!を使っているので、collectを一回繰り返す > 度にselfの要素数が減ってしまいます。 なるほどと思う反面,まだ理解できていないのですが,例えば,以下を実行す ると,ランダムに要素が取り出されてうまくいくような気がしてしまいます。 最初,aの要素は,5個あるので,collect は5回実行されると思うので, a.slice!(rand(a.length)) を5回繰り返してみました。 ==================================================================== irb(main):027:0> a = [1,2,3,4,5] => [1, 2, 3, 4, 5] irb(main):028:0> a.slice!(rand(a.length)) => 4 irb(main):029:0> a => [1, 2, 3, 5] irb(main):030:0> a.slice!(rand(a.length)) => 5 irb(main):031:0> a => [1, 2, 3] irb(main):032:0> a.slice!(rand(a.length)) => 1 irb(main):033:0> a => [2, 3] irb(main):034:0> a.slice!(rand(a.length)) => 3 irb(main):035:0> a => [2] irb(main):036:0> a.slice!(rand(a.length)) => 2 irb(main):037:0> a => [] irb(main):038:0> ==================================================================== 上記で実行された,4,5,1,3,2 が collect されて,シャッフル完了かなと思っ てしまいます……。 -- 前原 正英(Maehara Masahide) 宮崎県立佐土原高等学校/情報技術科 http://www.miyazaki-c.ed.jp/sadowara-th/ GPG Fingerprint: 17A6 8B1C 1186 1B45 41AE 5BBB CE42 E9EA 69A2 5844