From: "NARUSE, Yui" Date: 2010-12-21T15:20:49+09:00 Subject: [ruby-dev:42837] Re: [Ruby 1.9-Feature#4147] Array#sample で重みを指定したい 今の論点は以下の三つだと思います。 * 復元抽出の指定 * 重みの指定 (引数/block) * 効率 (ユースケースはなにか、何に対して最適化するか) == 復元抽出の指定 まず、今回のおみくじは復元抽出なので、復元抽出の指定を追加する必要があります。 optional hashで指定という論もありますが、わたしは Array#choice という名の復元抽出 メソッド追加を推します。 Array#choice は 1.8.7 に存在し、その後削除されましたが、この時のは無引数だったため、 互換性上の問題は発生しません。 sample/choice の名付けは Mathematica に沿っています。(see also [ruby-dev:42805]) == 重みの指定 重みをどこから与えるかですが、そもそも元のデータはどこにあるのかという観点があります。 一つはレシーバである ary の要素が何らかの形で持っている場合、 もう一つはそれとは別に ary なり hash なりで存在する場合があるでしょう。 両者を考えると、block でやるというのはそれなりに理由があるように感じます。 == 効率 呼び出し回数が多い場合について考えると、要素数・抽出数が少ない場合はどうでもよいとしましょう。 一方で要素数・抽出数が多い場合は、そもそもなんども呼び出して初期化するという設計がおかしいわけで、 そのために初期化をシンプルにするよりは、初期化済みの状態を enumerator (というか generator というか) で保持して、そこから取ってくるようにしたほうがいいんじゃないですかね。 もっとも、これは現時点では必ずしも入れる必要はない気もします。 > これなら悪くないと思います。 > ただ sample_each.each となると少し変なので、名前は要検討かと。 その場合は sample_each {|x| .. } とするだろうので、変にはなりませんね。 -- NARUSE, Yui naruse@airemix.jp