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>' 

メモ