From: Yusuke ENDOH Date: 2010-12-23T14:56:26+09:00 Subject: [ruby-dev:42863] Re: [Ruby 1.9-Feature#4147][Assigned] Array#sample で重みを指定したい 遠藤です。 2010年12月23日14:00 Kenta Murata : > 復元抽出が可能なようにする方法として replace キーワードが分かりにくいという > 意見が出ていたので、成瀬さんが提案しているように choice メソッドとして > 提供する方法が良いのではないかと。 この名前については ruby-core で議論すべきだと思います。 個人的には sample/choice の命名はわかるわけがないと思うのですが、 いい対案もないので、matz と英語圏ユーザがそれでいいというなら反対 しないです (replace はわからないどころか誤解させる語感があるので かなり反対ですが) 。 > Ojima さんが欲しがってる「n標本だけの重み付き抽出」を Array#sample で対応するなら、 > 次のようにすると良いのではないでしょうか。 > > - Array#sample では重みを配列かハッシュで受け取る。 > - Array#sample_by を用意し、後置ブロック経由で重みを与えられるようにする。 IRC では、sample(weight: proc { ... }) としたらどうかな、という 案が挙がっていました。 個人的には、ブロックが重みを表すのにはどうも違和感があります。 sort_by との類似という話もわかるっちゃわかるのですが。 また、sample_each と相性が悪いって問題もあります。 > n がある程度大きい場合は Walker のアルゴリズムを採用したほうが効率が良いはずです。 > アルゴリズムを切り替えるための閾値の調査などが必要になるでしょうね。 > Walker のアルゴリズムは昔 boost 用に作ったことがあります。 > それは CodeRepos の http://bit.ly/eAk1M1 ここに置いてあるのですが、 > 必要なら私が実装しても構いません。 おお。 ところで、mrkn さんは何のためにこれを作ったのかが興味あります。 この提案はユースケースが明確でなく、その辺の議論がどうも机上の域を こえてない感じですので、参考になるのではないかと。 > 同一条件での連続した抽出を高速に実現するには、遠藤さんが指摘されているように、 > 母集団をソートしたり Walker のアルゴリズムのように作業用データを準備したりする > 必要があります。準備のための計算コストを考えると、そのような準備済みの状態を > オブジェクトにして取り出して使い回せる仕組みが欲しくなります。 *snip* > だから、「Array#sample は遅いものだ」というお墨付きがあるなら、 > 最低限だけできるようにして「遅いのが嫌なら自分で実装してね」で良いと思います。 そんなもの組み込みにする必要があるんでしょうか。gem ではダメなんで しょうか。というのが私の意見だったんですが、 > と、ここまで書いていて気付きましたが、[ruby-dev:42829] で言及されている > 成瀬さんの sample_each は上で書いた「抽出器」を生成するメソッドになってるんですね。 ということです。両方あれば問題ないと思います。 -- Yusuke Endoh