[#42735] [Ruby 1.9-Feature#4147][Open] Array#sample で重みを指定したい — Yoji Ojima <redmine@...>

Feature #4147: Array#sample で重みを指定したい

52 messages 2010/12/10
[#42791] [Ruby 1.9-Feature#4147][Assigned] Array#sample で重みを指定したい — Shyouhei Urabe <redmine@...> 2010/12/18

チケット #4147 が更新されました。 (by Shyouhei Urabe)

[#42800] Re: [Ruby 1.9-Feature#4147][Assigned] Array#sample で重みを指定したい — Masaya TARUI <tarui@...> 2010/12/19

> じゃあ反対ないので実装はともかく、この仕様は基本入れる方向で考えましょう。反対の人は意思表示お早めに。

[#42763] [Ruby 1.9-Bug#4159][Open] test_block_variables(TestRipper::ParserEvents) が失敗する — Kouhei Yanagita <redmine@...>

Bug #4159: test_block_variables(TestRipper::ParserEvents) が失敗する

8 messages 2010/12/14

[#42894] [Ruby 1.8-Feature#4207][Open] これから「1.8.8」の話をしよう -- 1.8がこの先生きのこるには — Shyouhei Urabe <redmine@...>

Feature #4207: これから「1.8.8」の話をしよう -- 1.8がこの先生きのこるには

24 messages 2010/12/26
[#42935] Re: [Ruby 1.8-Feature#4207][Open] これから「1.8.8」の話をしよう -- 1.8がこの先生きのこるには — Kenta Murata <muraken@...> 2011/01/04

むらたです。

[#42936] Re: [Ruby 1.8-Feature#4207][Open] これから「1.8.8」の話をしよう -- 1.8がこの先生きのこるには — Kenta Murata <muraken@...> 2011/01/05

むらたです。

[ruby-dev:42837] Re: [Ruby 1.9-Feature#4147] Array#sample で重みを指定したい

From: "NARUSE, Yui" <naruse@...>
Date: 2010-12-21 06:20:49 UTC
List: ruby-dev #42837
今の論点は以下の三つだと思います。
* 復元抽出の指定
* 重みの指定 (引数/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

In This Thread