[ruby-trunk - Feature #5584][Open] Array#sample!

Issue #5584 has been reported by Masaki M…


Feature #5584: Array#sample!

Author: Masaki M.
Status: Open
Priority: Normal
Assignee:
Category: core
Target version: 2.0.0

=begin
ランダムに選択した要素をレシーバから取り除いて返すメソッドArray#sample!の追加を提案します。

配列からランダムに要素を取り出したい場合には

a = (1…5).to_a
a.delete_at(rand(a.size)) #=> 3
p a #=> [1, 2, 4, 5]

などと書く必要がありましたが、Array#sample!があれば

a = (1…5).to_a
a.sample! #=> 4
p a #=> [1, 2, 3, 5]

と簡潔に書く事ができます。

引数を指定した場合は、その数だけレシーバから要素を取り除き、新たな配列に取り除いた要素を入れて返します。

a = (1…10).to_a
p a.sample!(5) #=> [5, 4, 2, 6, 7]
p a #=> [1, 3, 8, 9, 10]

レシーバから選択した要素を取り去ってしまう事以外は、Array#sampleと同じ動作をします。

[].sample! #=> nil
[].sample!(1) #=> []
[1,2,3].sample!(random: rand) #=> 2

patchを添付します。
=end

Issue #5584 has been updated by Shota F…

もっと良いネーミングはない物でしょうかねえ.

ネーミングが微妙なような気がしてならない.

Feature #5584: Array#sample!

Author: Masaki M.
Status: Open
Priority: Normal
Assignee:
Category: core
Target version: 2.0.0

=begin
ランダムに選択した要素をレシーバから取り除いて返すメソッドArray#sample!の追加を提案します。

配列からランダムに要素を取り出したい場合には

a = (1…5).to_a
a.delete_at(rand(a.size)) #=> 3
p a #=> [1, 2, 4, 5]

などと書く必要がありましたが、Array#sample!があれば

a = (1…5).to_a
a.sample! #=> 4
p a #=> [1, 2, 3, 5]

と簡潔に書く事ができます。

引数を指定した場合は、その数だけレシーバから要素を取り除き、新たな配列に取り除いた要素を入れて返します。

a = (1…10).to_a
p a.sample!(5) #=> [5, 4, 2, 6, 7]
p a #=> [1, 3, 8, 9, 10]

レシーバから選択した要素を取り去ってしまう事以外は、Array#sampleと同じ動作をします。

[].sample! #=> nil
[].sample!(1) #=> []
[1,2,3].sample!(random: rand) #=> 2

patchを添付します。
=end

$B1sF#$G$9!#(B

2011$BG/(B11$B7n(B7$BF|(B15:43 Masaki M. [email protected]:

$B%i%s%@%`$KA*Br$7$?MWAG$r%l%7!<%P$+$i<h$j=|$$$FJV$9%a%=%C%I(BArray#sample!$B$NDI2C$rDs0F$7$^$9!#(B

$B$3$N5!G=$O$+$D$F$+$iMWK>$,$“$j$^$9$,!”$^$D$b$H$5$s$,6/9E$K(B
$BH?BP$7$F$$$^$9!#(B[ruby-core:18104] [ruby-core:18165]

sample! $B$H$$$&L>A0$,:GBg$N%M%C%/$N$h$&$G$9$N$G!“B>$NL>A0$r(B
$B9M$($k$H$$$$$H;W$$$^$9!#(B
($B0F30$^$D$b$H$5$s$N5$$,JQ$o$C$F$k2DG=@-$b$”$j$^$9$,(B)

Issue #5584 has been updated by Masaki M…

Mon, 7 Nov 2011 22:53:21 Yusuke E. :

sample! という名前が最大のネックのようですので、他の名前をえるといいと思います。

思いつくものとしてはpickやdrawといったところでしょうか。
個人的にはpickがしっくりきます。

Tue, 8 Nov 2011 00:44:07 近藤 充弘 :

Enumeratorを使ったほうが直感的だと思います

Enumerator#nextでは列挙状態が進みますが、Enumerable#takeでは進まないという問題があります。

a = (1…10).to_a.shuffle.each
a.take(3) #=> [10, 2, 6]
a.take(3) #=> [10, 2, 6]

Feature #5584: Array#sample!

Author: Masaki M.
Status: Open
Priority: Normal
Assignee:
Category: core
Target version: 2.0.0

=begin
ランダムに選択した要素をレシーバから取り除いて返すメソッドArray#sample!の追加を提案します。

配列からランダムに要素を取り出したい場合には

a = (1…5).to_a
a.delete_at(rand(a.size)) #=> 3
p a #=> [1, 2, 4, 5]

などと書く必要がありましたが、Array#sample!があれば

a = (1…5).to_a
a.sample! #=> 4
p a #=> [1, 2, 3, 5]

と簡潔に書く事ができます。

引数を指定した場合は、その数だけレシーバから要素を取り除き、新たな配列に取り除いた要素を入れて返します。

a = (1…10).to_a
p a.sample!(5) #=> [5, 4, 2, 6, 7]
p a #=> [1, 3, 8, 9, 10]

レシーバから選択した要素を取り去ってしまう事以外は、Array#sampleと同じ動作をします。

[].sample! #=> nil
[].sample!(1) #=> []
[1,2,3].sample!(random: rand) #=> 2

patchを添付します。
=end

$B6aF#$G$9(B

$BG[Ns$+$i%i%s%@%`$KMWAG$r<h$j=P$7$?$$>l9g$K$O(B

a = (1…5).to_a
a.delete_at(rand(a.size)) #=> 3
p a #=> [1, 2, 4, 5]

$B$J$I$H=q$/I,MW$,$"$j$^$7$?$,!"(B

a = (1…5).to_a.shuffle.each
a.next #=> 3

$B0z?t$r;XDj$7$?>l9g$O!"$=$N?t$@$1%l%7!<%P$+$iMWAG$r<h$j=|$-!"?7$?$JG[Ns$K<h$j=|$$$?MWAG$rF~$l$FJV$7$^$9!#(B

a = (1…10).to_a
p a.sample!(5) #=> [5, 4, 2, 6, 7]
p a #=> [1, 3, 8, 9, 10]

a = (1…10).to_a.shuffle.each
a.take(3) #=> [5, 4, 2, 6, 7]

Enumerator$B$r;H$C$?$[$&$,D>46E*$@$H;W$$$^$9!#(B


Mitsuhiro Kondo
[email protected]

むらたです。

(2011.11.08 15:39 ), Masaki M. wrote:

Mon, 7 Nov 2011 22:53:21 Yusuke E. :

sample! という名前が最大のネックのようですので、他の名前をえるといいと思います。

思いつくものとしてはpickやdrawといったところでしょうか。
個人的にはpickがしっくりきます。

pick や draw から無作為操作である事を感じられないのは私だけでしょうか?

Issue #5584 has been updated by Hiro A…

「無作為抽出」は random sampling という用語がありますので、多少長くても
Enumerable#random_sampling(n) ぐらいが適切かと思います。
#sample! が駄目で、#random_sampling が長過ぎるとなれば、この概念を導入するのに相応しい名前は無いように思われます。

Feature #5584: Array#sample!

Author: Masaki M.
Status: Open
Priority: Normal
Assignee:
Category: core
Target version: 2.0.0

=begin
ランダムに選択した要素をレシーバから取り除いて返すメソッドArray#sample!の追加を提案します。

配列からランダムに要素を取り出したい場合には

a = (1…5).to_a
a.delete_at(rand(a.size)) #=> 3
p a #=> [1, 2, 4, 5]

などと書く必要がありましたが、Array#sample!があれば

a = (1…5).to_a
a.sample! #=> 4
p a #=> [1, 2, 3, 5]

と簡潔に書く事ができます。

引数を指定した場合は、その数だけレシーバから要素を取り除き、新たな配列に取り除いた要素を入れて返します。

a = (1…10).to_a
p a.sample!(5) #=> [5, 4, 2, 6, 7]
p a #=> [1, 3, 8, 9, 10]

レシーバから選択した要素を取り去ってしまう事以外は、Array#sampleと同じ動作をします。

[].sample! #=> nil
[].sample!(1) #=> []
[1,2,3].sample!(random: rand) #=> 2

patchを添付します。
=end

Issue #5584 has been updated by Shota F…

じゃあsample!になりますかねぇ...

pick からは少なくとも無作為抽出な動作を感じ取ることはできないですね.

Feature #5584: Array#sample!

Author: Masaki M.
Status: Open
Priority: Normal
Assignee:
Category: core
Target version: 2.0.0

=begin
ランダムに選択した要素をレシーバから取り除いて返すメソッドArray#sample!の追加を提案します。

配列からランダムに要素を取り出したい場合には

a = (1…5).to_a
a.delete_at(rand(a.size)) #=> 3
p a #=> [1, 2, 4, 5]

などと書く必要がありましたが、Array#sample!があれば

a = (1…5).to_a
a.sample! #=> 4
p a #=> [1, 2, 3, 5]

と簡潔に書く事ができます。

引数を指定した場合は、その数だけレシーバから要素を取り除き、新たな配列に取り除いた要素を入れて返します。

a = (1…10).to_a
p a.sample!(5) #=> [5, 4, 2, 6, 7]
p a #=> [1, 3, 8, 9, 10]

レシーバから選択した要素を取り去ってしまう事以外は、Array#sampleと同じ動作をします。

[].sample! #=> nil
[].sample!(1) #=> []
[1,2,3].sample!(random: rand) #=> 2

patchを添付します。
=end

Issue #5584 has been updated by Masaki M…

確かにpickだけだと無作為に取り出す感じがありませんね。
pick_at_rand あるいは delete_at_rand はどうでしょう?

Feature #5584: Array#sample!

Author: Masaki M.
Status: Open
Priority: Normal
Assignee:
Category: core
Target version: 2.0.0

=begin
ランダムに選択した要素をレシーバから取り除いて返すメソッドArray#sample!の追加を提案します。

配列からランダムに要素を取り出したい場合には

a = (1…5).to_a
a.delete_at(rand(a.size)) #=> 3
p a #=> [1, 2, 4, 5]

などと書く必要がありましたが、Array#sample!があれば

a = (1…5).to_a
a.sample! #=> 4
p a #=> [1, 2, 3, 5]

と簡潔に書く事ができます。

引数を指定した場合は、その数だけレシーバから要素を取り除き、新たな配列に取り除いた要素を入れて返します。

a = (1…10).to_a
p a.sample!(5) #=> [5, 4, 2, 6, 7]
p a #=> [1, 3, 8, 9, 10]

レシーバから選択した要素を取り去ってしまう事以外は、Array#sampleと同じ動作をします。

[].sample! #=> nil
[].sample!(1) #=> []
[1,2,3].sample!(random: rand) #=> 2

patchを添付します。
=end

Issue #5584 has been updated by Shota F…

File by_sorah.diff added

パッチをちょっと改善しました. (see by_sorah.diff)

  • Array#sample, Array#sample! で処理が共通な部分が多いため,内部にさらに関数呼び出しを加え,フラグによって
    動作の分岐をするようにした

本当はテストケースも書こうと思ったのですが,明日やります…

Feature #5584: Array#sample!

Author: Masaki M.
Status: Open
Priority: Normal
Assignee:
Category: core
Target version: 2.0.0

=begin
ランダムに選択した要素をレシーバから取り除いて返すメソッドArray#sample!の追加を提案します。

配列からランダムに要素を取り出したい場合には

a = (1…5).to_a
a.delete_at(rand(a.size)) #=> 3
p a #=> [1, 2, 4, 5]

などと書く必要がありましたが、Array#sample!があれば

a = (1…5).to_a
a.sample! #=> 4
p a #=> [1, 2, 3, 5]

と簡潔に書く事ができます。

引数を指定した場合は、その数だけレシーバから要素を取り除き、新たな配列に取り除いた要素を入れて返します。

a = (1…10).to_a
p a.sample!(5) #=> [5, 4, 2, 6, 7]
p a #=> [1, 3, 8, 9, 10]

レシーバから選択した要素を取り去ってしまう事以外は、Array#sampleと同じ動作をします。

[].sample! #=> nil
[].sample!(1) #=> []
[1,2,3].sample!(random: rand) #=> 2

patchを添付します。
=end

$B$^$D$b$H(B $B$f$-$R$m$G$9(B

In message “Re: [ruby-dev:44825] Re: [ruby-trunk - Feature #5584][Open]
Array#sample!”
on Mon, 7 Nov 2011 22:53:21 +0900, Yusuke E. [email protected]
writes:

|2011$BG/(B11$B7n(B7$BF|(B15:43 Masaki M. [email protected]:
|>
$B%i%s%@%`$KA*Br$7$?MWAG$r%l%7!<%P$+$i<h$j=|$$$FJV$9%a%=%C%I(BArray#sample!$B$NDI2C$rDs0F$7$^$9!#(B
|
|$B$3$N5!G=$O$+$D$F$+$iMWK>$,$“$j$^$9$,!”$^$D$b$H$5$s$,6/9E$K(B
|$BH?BP$7$F$$$^$9!#(B[ruby-core:18104] [ruby-core:18165]
|
|sample! $B$H$$$&L>A0$,:GBg$N%M%C%/$N$h$&$G$9$N$G!“B>$NL>A0$r(B
|$B9M$($k$H$$$$$H;W$$$^$9!#(B
|($B0F30$^$D$b$H$5$s$N5$$,JQ$o$C$F$k2DG=@-$b$”$j$^$9$,(B)

$B$^$@;?@.$G$O$"$j$^$;$s!#(B

$B:GBg$NM}M3$,$3$N%a%=%C%I$,I{:nMQ$r@Q6KE*$KMxMQ!&4|BT$7$F$$$k(B
$BE@$G!“:G6aN.9T$N%W%m%0%i%_%s%0%9%?%$%k$K5U9T$7$F$$$k$3$H$G!”(B
$B$5$i$K(Bsample!$B$OB>$N(BArray$B$N%a%=%C%I$H!*$K$h$k0UL#$,JQ2=$7$F$$(B
$B$k$H$$$&E@$G$3$NL>A0$K$h$kF3F~$K$O@dBP$K;?@.$7$^$;$s!#(B

$BMW$9$k$KB>$N(BArray$B%/%i%9$N!%a%=%C%I$N4pK\E$JF0:n$O!"!V!$NL5(B
$B$$$b$N$O85$N(BArray$B$r%3%T!<$7$FA:n$7$?$b$N$rJV$9!#85$NG[Ns$OJQ(B $B2=$J$7!#A:n$K$h$C$FJQ2=$7$J$$>l9g$K$O(Bnil$B$rJV$9"(!W!"$H$$$&$b(B
$B$N$J$N$KBP$7!"Ds0F$5$l$F$$$k(Bsample!$B$O!V(Bsample$B$HF1$8A`:n$r$9$k(B
$B$H(B
$BF1;~$K(B*$B85$NG[Ns$rJQ99$9$k!W$H$$$&$b$N$G$9!#$3$3$,5$$KF~$i(B
$B$J$$!#(B

$B$b$A$m$s!“I{:nMQ$rA4H]Dj$9$k$o$1$G$O$J$$$N$G!”$3$N%a%=%C%I$,(B
$B$“$k$H$I$l$@$1JXMx$G$”$k$+$rNO@b$5$l$?>e$G!“E,@Z$H;W$o$l$kL>(B
$BA0$rDs0F$7$F$$$?$@$1$l$P!”@dBP$KL5M}$H$^$G$O8@$$$^$;$s$,!"%O!<(B
$B%I%k$O9b$$$H;W$$$^$9!#(B

$B"((B $B@53N$K$O(B Array#slice!
$B$O$3$N86B’$K=>$C$F$^$;$s$,!“$@$+$i$H(B
$B$$$C$F86B’$K=>$C$F%a%=%C%I$rA}$d$9$D$b$j$O$”$j$^$;$s(B

                            $B$^$D$b$H(B $B$f$-$R$m(B /:|)

Issue #5584 has been updated by mame (Yusuke E.).

Status changed from Open to Rejected

まつもとさんの意見に対して feedback がないので閉じます。


Yusuke E. [email protected]

Feature #5584: Array#sample!

Author: Glass_saga (Masaki M.)
Status: Rejected
Priority: Normal
Assignee:
Category: core
Target version: 2.0.0

=begin
ランダムに選択した要素をレシーバから取り除いて返すメソッドArray#sample!の追加を提案します。

配列からランダムに要素を取り出したい場合には

a = (1…5).to_a
a.delete_at(rand(a.size)) #=> 3
p a #=> [1, 2, 4, 5]

などと書く必要がありましたが、Array#sample!があれば

a = (1…5).to_a
a.sample! #=> 4
p a #=> [1, 2, 3, 5]

と簡潔に書く事ができます。

引数を指定した場合は、その数だけレシーバから要素を取り除き、新たな配列に取り除いた要素を入れて返します。

a = (1…10).to_a
p a.sample!(5) #=> [5, 4, 2, 6, 7]
p a #=> [1, 3, 8, 9, 10]

レシーバから選択した要素を取り去ってしまう事以外は、Array#sampleと同じ動作をします。

[].sample! #=> nil
[].sample!(1) #=> []
[1,2,3].sample!(random: rand) #=> 2

patchを添付します。
=end