General

Profile

oj (Yoji Ojima)

  • Login: oj
  • Registered on: 12/10/2010
  • Last sign in: 01/30/2011

Issues

open closed Total
Assigned issues 0 0 0
Reported issues 0 2 2

Activity

01/30/2011

07:14 PM Ruby Feature #4147: Array#sample で重みを指定したい
=begin
>機能的な必要性/十分性については私には判断がつきませんが、私
>には問題なさそうに見えます。ただし、each_sample, each_choice
>という名前に若干の違和感がありますので、ruby-coreの人たちの
>意見も聞きたいところです。

遅くなりましたが、簡単にまとめると、

- choice というネーミングは単一選択のニュアンスがあるので望ましくない
- 復元抽出をオプション repeat: true...
oj (Yoji Ojima)

01/07/2011

07:20 PM Ruby Feature #4247 (Rejected): New features for Array#sample, Array#choice
=begin
We are planning to add the following features of the random sampling to Array.

1. Weighted random sampling.
2. Sampling with replacement.
3. Iteration.

It is discussed in ruby-dev (Feature #3647 and #4147).


...
oj (Yoji Ojima)

01/06/2011

10:30 PM Ruby Feature #4147: Array#sample で重みを指定したい
=begin
>議論が大分入り組んで来たので、一旦現在の API とその実装の案を
>まとめてみました。sample_each は each_sample に改名してます。

これは、とりあえず意見は出尽くした感じですよね。
私としては遠藤さんがまとめられた案で問題ないと思いますが、まつもとさんのご意見はいかがでしょう?
命名についてはまだ議論の余地がありますが、ruby-core に投げるべきでしょうか。
=end
oj (Yoji Ojima)

12/22/2010

06:01 PM Ruby Feature #4147: Array#sample で重みを指定したい
=begin
>そして、ひとつだけ取り出すなら、復元抽出でも非復元抽出でもかわりないので、
>どちらでも気にしないんじゃないかと思っています。

おっしゃる通り、個人的には全く気にしません。
気にする人たちのことを考えて仕様を検討してほしいとは思っています。
=end
oj (Yoji Ojima)

12/21/2010

05:58 PM Ruby Feature #4147: Array#sample で重みを指定したい
=begin
>まず、今回のおみくじは復元抽出なので、復元抽出の指定を追加する必要があります。
>optional hashで指定という論もありますが、わたしは Array#choice という名の復元抽出
>メソッド追加を推します。

賛成です。1.8.7 であったものが急に使えなくなる問題も自然と解消されますし。

>> これなら悪くないと思います。
>> ただ sample_each.each となると少し変なので、名前は要検討かと。...
oj (Yoji Ojima)
12:36 PM Ruby Feature #4147: Array#sample で重みを指定したい
=begin
>ところで以前 naruse さんが (IRC で) 言ってたアイデアなのですが、
>Enumerator で返すという API が考えられます。つまり、
>
> e = %(大吉 中吉 小吉 凶).sample_each
> e.each {|x| p x } #=> 凶 中吉 大吉 小吉
>
> e = %(大吉 中吉 小吉 凶).sample_each(unique: false, weight: [1000, 100...
oj (Yoji Ojima)

12/20/2010

10:33 PM Ruby Feature #4147: Array#sample で重みを指定したい
=begin
>「重みを変えずに繰り返し抽選したい」というユースケースで有利になる
>んですが、汎用性に欠けますかね。結構ありそうだと思うんですが。

ほとんどの場合は一回の呼び出しで大量の抽出を行うことで代替可能ではないでしょうか。

繰り返しになりますが、二分探索は最適なアルゴリズムではない(簡便性を犠牲にする割に半端にしか速くならない)というのも重要な点で、高速な細切れ抽出を本当に求めるのであれば、以下のサイトのコードのように専用のクラスを用...
oj (Yoji Ojima)
02:06 PM Ruby Feature #4147: Array#sample で重みを指定したい
=begin
>係数レベルの性能には私も大して興味ないんですが、オーダが違うとなると
>さすがに気になります。特に、機能的には O(log n) で実現できるのに、
>見た目の都合で API を O(n) にしか実装できないよう制約してしまおうと
>いう話ですから。記述性の話もよくわかるので、悩ましいところですが。

メソッド自体が高速であっても、そのために累積分布を渡す必要があるというのでは、たとえば要素の重みを一つだけ変えて再抽選というときには...
oj (Yoji Ojima)
01:26 AM Ruby Feature #4147: Array#sample で重みを指定したい
=begin
>Ruby でも同じ使われ方が期待できるんですかねえ。
>いよいよ、まずは gem で作って配布して、多くの需要があることがわかった
>ら取り込む、という手順を踏むほうがいいような気がしてきました。

私個人としては高速性に興味はなく、最初のサンプルのような処理を標準機能の範囲で簡潔に記述することができさえすれば満足です。

単純な復元抽出に関しては (1..n).map { ary.sample } で代替できるので不要という意...
oj (Yoji Ojima)

12/19/2010

10:45 PM Ruby Feature #4147: Array#sample で重みを指定したい
=begin
>でも、重みを累積分布として与える例はないですねえ。
>sample ごときで常に O(n) かかってほしくないと思うのですが。

復元抽出の高速アルゴリズムである Walker's alias method を使うのに必要な情報は累積分布ではないので、それを引数として与えるというのは、簡便性重視と高速性重視のどちらにも寄らない中途半端な仕様であると考えます。
=end
oj (Yoji Ojima)

Also available in: Atom