Project

General

Profile

Actions

Feature #3647

closed

Array#sample(n, replace=false)

Added by mrkn (Kenta Murata) over 13 years ago. Updated about 4 years ago.

Status:
Feedback
Target version:
-
[ruby-dev:41918]

Description

Array#sample does not support sampling with replacement directly, so we must write codes like the following to obtain samples with replacement.

samples_with_replacement = n.times.map { source.sample }

If Array#sample has the argument for switching with/without replacement, we can write it as follow.

samples_with_replacement = source.sample(n, true)

The patch was attached. Please consider to merge.


Files

array_sample_with_replace.patch (3.64 KB) array_sample_with_replace.patch mrkn (Kenta Murata), 08/03/2010 01:13 PM
array_sample_with_replace_hash.patch (4.35 KB) array_sample_with_replace_hash.patch mrkn (Kenta Murata), 08/03/2010 04:53 PM
array_sample_shuffle.patch (9.62 KB) array_sample_shuffle.patch mrkn (Kenta Murata), 08/03/2010 06:25 PM

Related issues 2 (0 open2 closed)

Related to Ruby master - Feature #3649: Array#sample, Array#shuffle, Array#shuffle! で使用する乱数生成器を指定するためにオプショナル引数を追加するClosed08/03/2010Actions
Related to Ruby master - Feature #4247: New features for Array#sample, Array#choiceRejectedActions
Actions #1

Updated by mrkn (Kenta Murata) over 13 years ago

むらたです。

dev に英語で投稿してしまいました。ごめんなさい。
無理して英語で書いて投稿先を core にしていたと思っていたのですが・・・

On 2010/08/03, at 13:13, Kenta Murata wrote:

Feature #3647: Array#sample(n, replace=false)
http://redmine.ruby-lang.org/issues/show/3647

起票者: Kenta Murata
ステータス: Open, 優先度: Normal
カテゴリ: core, Target version: 1.9.x

Array#sample does not support sampling with replacement directly, so we must write codes like the following to obtain samples with replacement.

samples_with_replacement = n.times.map { source.sample }

If Array#sample has the argument for switching with/without replacement, we can write it as follow.

samples_with_replacement = source.sample(n, true)

この提案は、Array#sample メソッドで復元抽出もできるようにしたいという事です。
同様のインタフェースを持つ例として R の sample 関数があります。

--
Kenta Murata
OpenPGP FP = 1D69 ADDE 081C 9CC2 2E54 98C1 CEFE 8AFB 6081 B062

本を書きました!!
『Ruby 逆引きレシピ』 http://www.amazon.co.jp/dp/4798119881/mrkn-22

E-mail:
twitter: http://twitter.com/mrkn/
blog: http://d.hatena.ne.jp/mrkn/

Actions #2

Updated by mrkn (Kenta Murata) over 13 years ago

replace の指定を、オプショナルなハッシュを経由して行うように patch を変更しました。
こうすると、Array#sample に対してオプショナルな引数を追加しやすくなりますよね。
例えば、乱数生成器を外部から指定するとか。

Actions #3

Updated by mrkn (Kenta Murata) over 13 years ago

IRC でなかださんが random 引数にも対応した patch を作ってくださいました。
http://www.atdot.net/sp/raw/0dgk6l

Array#sample がデフォルトでない乱数生成器を受け付けるならば、
Array#shuffleArray#shuffle! も同じように受け付けないと不自然だと思います。
そこで、中田さんの patch をベースに Array#shuffleArray#shuffle! に対して random 引数を追加する変更をし、
せっかくなのでテストも追記した新しい patch を作成しました。

Actions #4

Updated by mrkn (Kenta Murata) over 13 years ago

先程、乱数生成器を指定する変更も含んだ patch を投稿しましたが、
もともとは Array#sample を復元抽出に対応させるための feature request でした。

そこで、乱数生成器の指定に関する変更点は別の feature request として分離することにしました。

ということで、この feature request の最終的な提案 patch は #2 で追加したファイルであると考えて下さい。

Actions #5

Updated by tarui (Masaya Tarui) over 13 years ago

Array#sampleの提案が出ていて思い出しました。
これはどうなってるんでしたっけ?

replace の指定を、オプショナルなハッシュを経由して行うように patch を変更しました。
こうすると、Array#sample に対してオプショナルな引数を追加しやすくなりますよね。
例えば、乱数生成器を外部から指定するとか。

オプショナルなハッシュ経由は名前を覚えなければならないという点で反対したいです。

サンプリングで再抽選(復元抽出?)するかどうかはかなり基本的な話だと思うので、
オプションをつけること自体は賛成します。

Actions #6

Updated by matz (Yukihiro Matsumoto) over 13 years ago

まつもと ゆきひろです

In message "Re: [ruby-dev:42743] [Ruby 1.9-Feature#3647] Array#sample(n, replace=false)"
on Fri, 10 Dec 2010 23:40:21 +0900, Masaya Tarui writes:

Array#sampleの提案が出ていて思い出しました。
これはどうなってるんでしたっけ?

合意がとれず、放置だと思います。

replace の指定を、オプショナルなハッシュを経由して行うように patch を変更しました。
こうすると、Array#sample に対してオプショナルな引数を追加しやすくなりますよね。
例えば、乱数生成器を外部から指定するとか。

オプショナルなハッシュ経由は名前を覚えなければならないという点で反対したいです。

サンプリングで再抽選(復元抽出?)するかどうかはかなり基本的な話だと思うので、
オプションをつけること自体は賛成します。

キーワード引数には反対だが、オプションには賛成であるとなると、
具体的にはどのような「オプション」を想定しておられますか?

Actions #7

Updated by tarui (Masaya Tarui) over 13 years ago

たるいです。

2010年12月11日8:55 Yukihiro Matsumoto :

まつもと ゆきひろです

In message "Re: [ruby-dev:42743] [Ruby 1.9-Feature#3647] Array#sample(n, replace=false)"
on Fri, 10 Dec 2010 23:40:21 +0900, Masaya Tarui writes:

Array#sampleの提案が出ていて思い出しました。
これはどうなってるんでしたっけ?

合意がとれず、放置だと思います。

失礼ながら特に議論した形跡が分からなかったんですが、
どこかに合意が取れない項目があったんでしょうか?

replace の指定を、オプショナルなハッシュを経由して行うように patch を変更しました。
こうすると、Array#sample に対してオプショナルな引数を追加しやすくなりますよね。
例えば、乱数生成器を外部から指定するとか。

オプショナルなハッシュ経由は名前を覚えなければならないという点で反対したいです。

サンプリングで再抽選(復元抽出?)するかどうかはかなり基本的な話だと思うので、
オプションをつけること自体は賛成します。

キーワード引数には反対だが、オプションには賛成であるとなると、
具体的にはどのような「オプション」を想定しておられますか?

何もないよりはキーワード引数でもあった方がいいとは思っていますが、
想定してるものは、最初のむらけんさんの提案の方です。

[1,2,3,4].sample  #=>1個なので再抽選関係なし
[1,2,3,4].sample(3) #=>再抽選なし

ここまでが現在の仕様ですが、

[1,2,3,4].sample(3,true) #=>再抽選あり
[1,2,3,4].sample(3,false) #=>再抽選なし

が追加になります。

以上、ご検討お願いします。

--
樽家昌也(Masaya TARUI)
No Tool,No Life.

Actions #8

Updated by matz (Yukihiro Matsumoto) over 13 years ago

まつもと ゆきひろです

In message "Re: [ruby-dev:42751] Re: [Ruby 1.9-Feature#3647] Array#sample(n, replace=false)"
on Sat, 11 Dec 2010 23:04:11 +0900, Masaya TARUI writes:

失礼ながら特に議論した形跡が分からなかったんですが、
どこかに合意が取れない項目があったんでしょうか?

「本当に必要なの」ってところがですかね。

何もないよりはキーワード引数でもあった方がいいとは思っていますが、
想定してるものは、最初のむらけんさんの提案の方です。

[1,2,3,4].sample  #=>1個なので再抽選関係なし
[1,2,3,4].sample(3) #=>再抽選なし

ここまでが現在の仕様ですが、

[1,2,3,4].sample(3,true) #=>再抽選あり
[1,2,3,4].sample(3,false) #=>再抽選なし

が追加になります。

反対します。trueの意味がなんであるか、絶対にわからなくなるか
らです。たとえば現在でも instance_methods は真偽値をオプショ
ンとして受け付けますが、trueの時にどう振舞うかは私でさえ覚え
ていられません。これは失敗だったと思っています。

Actions #9

Updated by mame (Yusuke Endoh) about 13 years ago

遠藤です。

2010年12月11日23:38 Yukihiro Matsumoto :

まつもと ゆきひろです

In message "Re: [ruby-dev:42751] Re: [Ruby 1.9-Feature#3647] Array#sample(n, replace=false)"
? ?on Sat, 11 Dec 2010 23:04:11 +0900, Masaya TARUI writes:

失礼ながら特に議論した形跡が分からなかったんですが、
どこかに合意が取れない項目があったんでしょうか?

「本当に必要なの」ってところがですかね。

同じく、この機能は

(1..n).map { ary.sample }

で済むので、

ary.sample(replace: true)

じゃ字数も変わらないし、本当にいるのかなという気がします。
まあ Array#sample 自体も ary[rand(ary.size)] で済むといえば
済むのですが。

何もないよりはキーワード引数でもあった方がいいとは思っていますが、
想定してるものは、最初のむらけんさんの提案の方です。

[1,2,3,4].sample ?#=>1個なので再抽選関係なし
[1,2,3,4].sample(3) #=>再抽選なし

ここまでが現在の仕様ですが、

[1,2,3,4].sample(3,true) #=>再抽選あり
[1,2,3,4].sample(3,false) #=>再抽選なし

が追加になります。

反対します。trueの意味がなんであるか、絶対にわからなくなるか
らです。たとえば現在でも instance_methods は真偽値をオプショ
ンとして受け付けますが、trueの時にどう振舞うかは私でさえ覚え
ていられません。これは失敗だったと思っています。

まつもとさんと同じでこれには反対です。

入れるとしたら sample(何かキーワード: true) だと思うんですが、
元の提案の "replace" は、非ネイティブかつ統計用語に詳しくない
私としては、選択された要素を破壊的に取り除くように思えてしまう
(つまり以下の挙動を期待する) ので嫌らしいです。

ary = [1, 2, 3]
p ary.sample(replace: true) #=> 1
p ary #=> [2, 3]

よく考えるとこの挙動は別に replace してないんですが、replace
には破壊的な語感がありすぎてこんなふうに思ってしまいます。

余談ですが、この挙動はこの挙動で欲しい。

duplication: true とかどうなのかなあ。ruby-core に持っていくと
いいかもしれないですね。英語圏だと replacement で完全制覇されて
いるという噂もありますが。

--
Yusuke Endoh

Actions #10

Updated by akr (Akira Tanaka) about 13 years ago

2010年12月19日23:22 Yusuke ENDOH :

入れるとしたら sample(何かキーワード: true) だと思うんですが、
元の提案の "replace" は、非ネイティブかつ統計用語に詳しくない
私としては、選択された要素を破壊的に取り除くように思えてしまう
(つまり以下の挙動を期待する) ので嫌らしいです。

ary = [1, 2, 3]
p ary.sample(replace: true) #=> 1
p ary #=> [2, 3]

よく考えるとこの挙動は別に replace してないんですが、replace
には破壊的な語感がありすぎてこんなふうに思ってしまいます。

余談ですが、この挙動はこの挙動で欲しい。

duplication: true とかどうなのかなあ。ruby-core に持っていくと
いいかもしれないですね。英語圏だと replacement で完全制覇されて
いるという噂もありますが。

unique とか。
現在の挙動 (非復元抽出) が unique: true で。
unique: false とすると復元抽出。

(uniq でも)

--
[田中 哲][たなか あきら][Tanaka Akira]

Updated by mame (Yusuke Endoh) almost 12 years ago

  • Description updated (diff)
  • Status changed from Open to Feedback
  • Assignee set to mrkn (Kenta Murata)

mrkn さん、

matz の「本当に必要なの」というのに返事と、キーワードの名前の候補出しをお願いします。

--
Yusuke Endoh

Updated by yhara (Yutaka HARA) over 11 years ago

  • Target version changed from 2.0.0 to 2.6
Actions #13

Updated by naruse (Yui NARUSE) about 6 years ago

  • Target version deleted (2.6)

Updated by nobu (Nobuyoshi Nakada) about 4 years ago

  • Description updated (diff)

https://github.com/ruby/ruby/pull/2955
The option name is replace for now.

Updated by sawa (Tsuyoshi Sawada) about 4 years ago

Array#repeated_combination, Array#repeated_permutation が既にあり、本件はこれと類似した内容なので、一貫性の観点から Array#repeated_sample という名の独立したメソッドが良いと思います。あるいは、それが数学用語として間違っているなら、 Array#replaced_sample でよいかなという気もします。

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0