[#44904] [ruby-trunk - Bug #5688][Open] Solaris10 で spawn を繰り返すとメモリリークする — okkez _ <redmine@...>

14 messages 2011/11/29

[ruby-dev:44833] [ruby-trunk - Feature #5584] Array#sample!

From: Hiro Asari <asari.ruby@...>
Date: 2011-11-08 12:46:13 UTC
List: ruby-dev #44833
Issue #5584 has been updated by Hiro Asari.


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

Author: Masaki Matsushita
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


-- 
http://redmine.ruby-lang.org

In This Thread