[#44310] プログラムに対して意図したとおりの文字列を渡す方法 — "Information Kanasansoft" <kanasansoft@...>

kanasanです。

9 messages 2007/12/05

[#44332] クラス:相互参照系の作成方法について質問です — "Saburoh Sakai" <sabroh@...>

はじめまして、さかいと申します。

12 messages 2007/12/11

[#44366] Rake改善プロジェクト — "Hajime Hoshi" <hajimehoshi@...>

東京大学修士 1 年の星一と申します。

14 messages 2007/12/19

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

From: take_tk <ggb03124@...>
Date: 2007-12-18 01:46:37 UTC
List: ruby-list #44355
たけ(tk)です

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

> 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)=熊谷秀武


In This Thread