Ruby_Array_52
この記事は、以下のドキュメントを改変(自分なりに整理)して利用しています。
class Array (Ruby 3.1 リファレンスマニュアル)
インスタンスメソッド
sample -> object | nil
sample(n) -> Array
sample(random: Random) -> object | nil
sample(n, random: Random) -> Array
- 配列の要素1個ランダムに選んで返す
- 引数を指定した場合は自身の要素数を超えない範囲でn個ランダムに選んで返す
- 重複したインデックスは選択されない
- そのため、自身がユニークな配列の場合は返り値もユニークな配列になる
- 配列が空の場合、無引数の場合はnilを、個数を指定した場合は空配列を返す
- srand()が有効
- nに自身の要素数以上の値を指定した場合、要素数と同じ数の配列を返す
- randomには乱数生成器(主にRandomオブジェクト)を指定する
- 選択する要素のインデックスを返す rand メソッドに応答するオブジェクトであれば指定することが可能
- randメソッドの引数にはRandom#rand(max) のように選択可能なインデックスの最大値が指定される
- Kernel.#rand、Random を使用しないオブジェクトを指定した場合、Kernel.#srandの指定に影響されない
- nに整数以外の(暗黙の型変換が行えない)オブジェクトを指定した場合TypeErrorが、負の数を指定した場合ArgumentErrorが発生する
irb(main):001:0> arr = [1, 'a', ['A', 'B']] => [1, "a", ["A", "B"]] irb(main):002:0> arr.sample => 1 ... irb(main):005:0> arr.sample => ["A", "B"] ... irb(main):016:0> arr.sample => "a" ... irb(main):018:0> arr.sample(2) => [["A", "B"], 1] irb(main):019:0> arr.sample(2) => ["a", ["A", "B"]] irb(main):020:0> arr.sample(2) => ["a", 1]
irb(main):001:1* class Foo irb(main):002:2* def self.rand(arg) irb(main):003:2* pp arg irb(main):004:2* 1 irb(main):005:1* end irb(main):006:1* end => :rand irb(main):007:0> %w[a b c d e].sample(random: Foo) 5 => "b" irb(main):008:0> %w[a b c d e].sample(random: Foo) 5 => "b" irb(main):009:0> %w[a b c d e].sample(random: Foo) 5 => "b" irb(main):010:0> %w[a b c d e].sample(3, random: Foo) 5 4 3 => ["b", "c", "d"] irb(main):011:0> %w[a b c d e].sample(3, random: Foo) 5 4 3 => ["b", "c", "d"] irb(main):012:0> %w[a b c d e].sample(3, random: Foo) 5 4 3 => ["b", "c", "d"]
irb(main):001:0> %w[a b c d e].sample(1.0) => ["a"] irb(main):002:0> %w[a b c d e].sample('1') <internal:array>:66:in `sample': no implicit conversion of String into Integer (TypeError) from (irb):2:in `<main>' from /Users/mfham/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/irb-1.4.1/exe/irb:11:in `<top (required)>' from /Users/mfham/.rbenv/versions/3.1.0/bin/irb:25:in `load' from /Users/mfham/.rbenv/versions/3.1.0/bin/irb:25:in `<main>' irb(main):003:0> %w[a b c d e].sample(-1) <internal:array>:66:in `sample': negative sample number (ArgumentError) from (irb):3:in `<main>' from /Users/mfham/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/irb-1.4.1/exe/irb:11:in `<top (required)>' from /Users/mfham/.rbenv/versions/3.1.0/bin/irb:25:in `load' from /Users/mfham/.rbenv/versions/3.1.0/bin/irb:25:in `<main>'
メモ
ruby/NEWS-3.1.0.md at 7cc0c53169759996f75eacd7cceb2ea8d47c57d7 · ruby/ruby · GitHub
- 3.1.0でパフォーマンスが改善されている
ruby/array.rb at f943264565f3072a30616fa93ffa3da3790294b0 · ruby/ruby · GitHub
- 必須パラメータありなしで処理を分けてる?
- nの大きさでも処理が分かれてる?