[Feature #3647] Array#sample(n, replace=false)

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

e$B5/I<<Te(B: Kenta M.
e$B%9%F!<%?%9e(B: Open, e$BM%@hEYe(B: Normal
e$B%+%F%4%je(B: 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)

The patch was attached. Please consider to merge.

e$B$`$i$?$G$9!#e(B

dev e$B$K1Q8l$GEj9F$7$F$7$^$$$^$7$?!#$4$a$s$J$5$$!#e(B
e$BL5M}[email protected]$re(B core
e$B$K$7$F$$$?$H;W$C$F$$$?$N$G$9$,!&!&!&e(B

On 2010/08/03, at 13:13, Kenta M. wrote:

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

samples_with_replacement = source.sample(n, true)

e$B$3$NDs0F$O!“e(BArray#sample
e$B%a%=%C%I$GI|85Cj=P$b$G$-$k$h$&$K$7$?$$$H$$$&;v$G$9!#e(B
e$BF1MM$N%$%s%?%U%’!<%9$r;}$DNc$H$7$Fe(B R e$B$Ne(B sample
e$B4X?t$,$”$j$^$9!#e(B


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

e$BK$r=q$-$^$7$?e(B!!
e$B!Xe(BRuby e$B5U0z$-%l%7%T!Ye(B
http://www.amazon.co.jp/dp/4798119881/mrkn-22

E-mail: [email protected]
twitter: http://twitter.com/mrkn/
blog: http://d.hatena.ne.jp/mrkn/

e$B%A%1%C%He(B #3647 e$B$,99?7$5$l$^$7$?!#e(B (by Kenta M.)

e$B%U%!%$%ke(B array_sample_with_replace_hash.patch e$BDI2Ce(B

replace e$B$N;XDj$r!"%%W%7%g%J%k$J%O%C%7%e$r7PM3$7$F9T$&$h$&$Ke(B patch
e$B$rJQ99$7$^$7$?!#e(B
e$B$3$&$9$k$H!"e(BArray#sample
e$B$KBP$7$F%
%W%7%g%J%k$J0z?t$rDI2C$7$d$9$/$J$j$^$9$h$M!#e(B
e$BNc$($P!"[email protected]@.4o$r30It$+$i;XDj$9$k$H$+!#e(B


http://redmine.ruby-lang.org/issues/show/3647

e$B%A%1%C%He(B #3647 e$B$,99?7$5$l$^$7$?!#e(B (by Kenta M.)

e$B%U%!%$%ke(B array_sample_shuffle.patch e$BDI2Ce(B

IRC [email protected]$5$s$,e(B random e$B0z?t$K$bBP1~$7$?e(B patch
e$B$r:n$C$F$/[email protected]$5$$$^$7$?!#e(B
http://www.atdot.net/sp/raw/0dgk6l

Array#sample e$B$,%G%U%)%k%[email protected]@.4o$r<u$1IU$1$k$J$i$P!"e(B
Array#shuffle e$B$He(B Array#shuffle!
e$B$bF1$8$h$&$K<u$1IU$1$J$$$HIT<[email protected]$H;W$$$^$9!#e(B
e$B$=$3$G!"CfED$5$s$Ne(B patch e$B$r%Y!<%9$Ke(B Array#shuffle e$B$He(B
Array#shuffle! e$B$KBP$7$Fe(B random e$B0z?t$rDI2C$9$kJQ99$r$7!"e(B
e$B$;$C$+$/$J$N$G%F%9%H$bDI5-$7$??7$7$$e(B patch e$B$r:[email protected]$7$^$7$?!#e(B


http://redmine.ruby-lang.org/issues/show/3647

e$B%A%1%C%He(B #3647 e$B$,99?7$5$l$^$7$?!#e(B (by Kenta M.)

[email protected]!"[email protected]@.4o$r;XDj$9$kJQ99$b4^[email protected](B patch
e$B$rEj9F$7$^$7$?$,!"e(B
e$B$b$H$b$H$Oe(B Array#sample e$B$rI|85Cj=P$KBP1~$5$;$k$?$a$Ne(B feature
request e$B$G$7$?!#e(B

e$B$=$3$G!"[email protected]@.4o$N;[email protected]$OJL$Ne(B feature request
e$B$H$7$FJ,N%$9$k$3$H$K$7$^$7$?!#e(B

e$B$H$$$&$3$H$G!"$3$Ne(B feature request e$B$N:G=E$JDs0Fe(B patch
e$B$Oe(B #2 e$B$GDI2C$7$?%U%!%$%k$G$"$k$H9M$($F2<$5$$!#e(B


http://redmine.ruby-lang.org/issues/show/3647

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

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 T.
[email protected] writes:

|Array#sample$B$NDs0F$,=P$F$$$F;W$$=P$7$^$7$?!#(B
|$B$3$l$O$I$&$J$C$F$k$s$G$7$?$C$1!)(B

$B9g0U$,$H$l$:!"J|[email protected]$H;W$$$^$9!#(B

|>replace $B$N;XDj$r!"%%W%7%g%J%k$J%O%C%7%e$r7PM3$7$F9T$&$h$&$K(B patch
$B$rJQ99$7$^$7$?!#(B
|>$B$3$&$9$k$H!"(BArray#sample
$B$KBP$7$F%
%W%7%g%J%k$J0z?t$rDI2C$7$d$9$/$J$j$^$9$h$M!#(B
|>$BNc$($P!“[email protected]@.4o$r30It$+$i;XDj$9$k$H$+!#(B
|
|$B%%W%7%g%J%k$J%O%C%7%e7PM3$OL>A0$r3P$($J$1$l$P$J$i$J$$$H$$$&[email protected]$GH?BP$7$?$$$G$9!#(B
|
|$B%5%s%W%j%s%0$G:FCjA
(B($BI|85Cj=P(B?)$B$9$k$+$I$&$+$O$+$J$j4pK\E*[email protected]$H;W$&$N$G!”(B
|$B%*%W%7%g%s$r$D$1$k$3$H<+BN$O;[email protected]$7$^$9!#(B

$B%-!<%o!<%[email protected]$,!"%%W%7%g%s$K$O;[email protected]$G$"$k$H$J$k$H!"(B
$B6qBNE
$K$O$I$N$h$&$J!V%%W%7%g%s!W$rA[Dj$7$F$$i$l$^$9$+!)(B

チケット #3647 が更新されました。 (by Masaya T.)

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

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

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

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

$B$?$k$$$G$9!#(B

2010$BG/(B12$B7n(B11$BF|(B8:55 Yukihiro M. [email protected]:

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

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 T. [email protected]
writes:

|Array#sample$B$NDs0F$,=P$F$$$F;W$$=P$7$^$7$?!#(B
|$B$3$l$O$I$&$J$C$F$k$s$G$7$?$C$1!)(B

$B9g0U$,$H$l$:!"J|[email protected]$H;W$$$^$9!#(B

$B<:Ni$J$,[email protected][email protected]$,J,$+$i$J$+$C$?$s$G$9$,!"(B
$B$I$3$+$K9g0U$,<h$l$J$$9`L$,$"$C$?$s$G$7$g$&$+!)(B

$B6qBNE*$K$O$I$N$h$&$J!V%%W%7%g%s!W$rA[Dj$7$F$$i$l$^$9$+!)(B
$B2?$b$J$$$h$j$O%-!<%o!<%I0z?t$G$b$"$C$?J}$,$$$$$H$O;W$C$F$$$^$9$,!"(B
$BA[Dj$7$F$k$b$N$O!":G=i$N$`$i$1$s$5$s$NDs0F$NJ}$G$9!#(B

[1,2,3,4].sample #=>1$B8D$J$N$G:FCjA4X78$J$7(B
[1,2,3,4].sample(3) #=>$B:FCjA
$J$7(B

$B$3$3$^$G$,8=:_$N;EMM$G$9$,!"(B

[1,2,3,4].sample(3,true) #=>$B:FCjA*$"$j(B
[1,2,3,4].sample(3,false) #=>$B:FCjA*$J$7(B

$B$,DI2C$K$J$j$^$9!#(B

$B0J>e!"$48!F$$*4j$$$7$^$9!#(B

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

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 [email protected]
writes:

|$B<:Ni$J$,[email protected][email protected]$,J,$+$i$J$+$C$?$s$G$9$,!"(B
|$B$I$3$+$K9g0U$,<h$l$J$$9`L$,$"$C$?$s$G$7$g$&$+!)(B

$B!VK\Ev$KI,MW$J$N!W$C$F$H$3$m$,$G$9$+$M!#(B

|$B2?$b$J$$$h$j$O%-!<%o!<%I0z?t$G$b$"$C$?J}$,$$$$$H$O;W$C$F$$$^$9$,!"(B
|$BA[Dj$7$F$k$b$N$O!":G=i$N$`$i$1$s$5$s$NDs0F$NJ}$G$9!#(B
|
|[1,2,3,4].sample #=>1$B8D$J$N$G:FCjA4X78$J$7(B
|[1,2,3,4].sample(3) #=>$B:FCjA
$J$7(B
|
|$B$3$3$^$G$,8=:_$N;EMM$G$9$,!"(B
|
|[1,2,3,4].sample(3,true) #=>$B:FCjA*$"$j(B
|[1,2,3,4].sample(3,false) #=>$B:FCjA*$J$7(B
|
|$B$,DI2C$K$J$j$^$9!#(B

$BH?BP$7$^$9!#(Btrue$B$N0UL#$,$J$s$G$"$k$+!"@dBP$K$o$+$i$J$/$J$k$+(B
$B$i$G$9!#$?$H$($P8=:_$G$b(B instance_methods $B$O??56CM$r%*%W%7%g(B
$B%s$H$7$F<u$1IU$1$^$9$,!"(Btrue$B$N;~$K$I$&?6Iq$&$+$O;d$G$5$(3P$((B
$B$F$$$i$l$^$;$s!#$3$l$O<:[email protected]$C$?$H;W$C$F$$$^$9!#(B

$B1sF#$G$9!#(B

2010$BG/(B12$B7n(B11$BF|(B23:38 Yukihiro M. [email protected]:

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

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 [email protected] writes:

|$B<:Ni$J$,[email protected][email protected]$,J,$+$i$J$+$C$?$s$G$9$,!"(B
|$B$I$3$+$K9g0U$,<h$l$J$$9`L$,$"$C$?$s$G$7$g$&$+!)(B

$B!VK\Ev$KI,MW$J$N!W$C$F$H$3$m$,$G$9$+$M!#(B

$BF1$8$/!"$3$N5!G=$O(B

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

$B$G:Q$`$N$G!"(B

ary.sample(replace: true)

$B$8$c;z?t$bJQ$o$i$J$$$7!“K\Ev$K$$$k$N$+$J$H$$$&5$$,$7$^$9!#(B
$B$^$”(B Array#sample $B<+BN$b(B ary[rand(ary.size)] $B$G:Q$$H$$$($P(B $B:Q$$N$G$9$,!#(B

|
|$B$,DI2C$K$J$j$^$9!#(B

$BH?BP$7$^$9!#(Btrue$B$N0UL#$,$J$s$G$"$k$+!"@dBP$K$o$+$i$J$/$J$k$+(B
$B$i$G$9!#$?$H$($P8=:_$G$b(B instance_methods $B$O??56CM$r%*%W%7%g(B
$B%s$H$7$F<u$1IU$1$^$9$,!"(Btrue$B$N;~$K$I$&?6Iq$&$+$O;d$G$5$(3P$((B
$B$F$$$i$l$^$;$s!#$3$l$O<:[email protected]$C$?$H;W$C$F$$$^$9!#(B

$B$^$D$b$H$5$s$HF1$8$G$3$l$K$OH?BP$G$9!#(B

$BF~$l$k$H$7$?$i(B sample($B2?$+%-!<%o!<%I(B: true)
[email protected]$H;W$&$s$G$9$,!"(B
$B85$NDs0F$N(B “replace” $B$O!"Hs%M%$%F%#%V$+$DE}7WMQ8l$K>$7$/$J$$(B
$B;d$H$7$F$O!"ABr$5$l$?MWAG$rGK2uE$K<h$j=|$/$h$&$K;W$($F$7$^$&(B
($B$D$^$j0J2<$N5sF0$r4|BT$9$k(B) $B$N$G7y$i$7$$$G$9!#(B

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

$B$h$/9M$($k$H$3$N5sF0$OJL$K(B replace $B$7$F$J$$$s$G$9$,!"(Breplace
$B$K$OGK2uE*$J8l46$,$"$j$9$.$F$3$s$J$U$&$K;W$C$F$7$^$$$^$9!#(B

$BM>CL$G$9$,!"$3$N5sF0$O$3$N5sF0$GM_$7$$!#(B

duplication: true $B$H$+$I$&$J$N$+$J$"!#(Bruby-core $B$K;}$C$F$$$/$H(B
$B$$$$$+$b$7$l$J$$$G$9$M!#[email protected]$H(B replacement [email protected])GF$5$l$F(B
$B$$$k$H$$$&1=$b$"$j$^$9$,!#(B

2010$BG/(B12$B7n(B19$BF|(B23:22 Yusuke ENDOH [email protected]:

$B$K$OGK2uE*$J8l46$,$"$j$9$.$F$3$s$J$U$&$K;W$C$F$7$^$$$^$9!#(B

$BM>CL$G$9$,!"$3$N5sF0$O$3$N5sF0$GM_$7$$!#(B

duplication: true $B$H$+$I$&$J$N$+$J$"!#(Bruby-core $B$K;}$C$F$$$/$H(B
$B$$$$$+$b$7$l$J$$$G$9$M!#[email protected]$H(B replacement [email protected])GF$5$l$F(B
$B$$$k$H$$$&1=$b$"$j$^$9$,!#(B

unique $B$H$+!#(B
$B8=:_$N5sF0(B ($BHsI|85Cj=P(B) $B$,(B unique: true $B$G!#(B
unique: false $B$H$9$k$HI|85Cj=P!#(B

(uniq $B$G$b(B)