names=rand
visibility=public
kind=defined

--- rand -> Float
--- rand(max) -> Integer | Float
--- rand(range) -> Integer | Float | nil

一様な疑似乱数を発生させます。

最初の形式では 0.0 以上 1.0 未満の実数を返します。

二番目の形式では 0 以上 max 未満の数を返します。
max が正の整数なら整数を、正の実数なら実数を返します。
0 や負の数を指定することは出来ません。

三番目の形式では range で指定された範囲の値を返します。
range の始端と終端が共に整数の場合は整数を、少なくとも片方が実数の場合は実数を返します。
range に含まれる数が無い場合は nil を返します。
rangeが終端を含まない(つまり ... で生成した場合)には終端の値は乱数の範囲から除かれます。
range.end - range.begin が整数を返す場合は range.begin + self.rand((range.end - range.begin) + e)
の値を返します(e は終端を含む場合は1、含まない場合は0です)。
range.end - range.begin が実数を返す場合も同様です。
このため range が [[c:Time]] の場合などにもうまく動作します。

引数が実数でも範囲でもない場合は [[m:Object#to_int]] で変換した値が指定されたものとして扱います。

@param max   乱数値の上限を正の整数または実数で指定します。
             max 自体は乱数値の範囲に含まれません。
@param range 発生させる乱数値の範囲を [[c:Range]] オブジェクトで指定します。
             range.end - range.begin は数値である必要があり、
             range.begin + 数値 が適切な値を返す必要があります。

@raise ArgumentError 引数の数が0または1では無い時、引数に負の数値を与えた時に発生します。

  # Kernel.#rand とほぼ同様の使い勝手
  prng = Random.new(1234)
  prng.rand            # => 0.1915194503788923
  srand(1234)
  rand                 # => 0.1915194503788923
  
  # max に実数も指定出来る
  prng.rand(6.5)       # => 4.043707011758907
  # (rand(6) と同等)
  rand(6.5)            # => 5

  # 引数には Range も指定できる
  # 0 から 10までの整数が得られる
  prng.rand(0..10) # => 4
  # 0 から 9までの整数が得られる
  prng.rand(0...10) # => 8
  # 0 から 4.2までの実数が得られる (4.2 が得られる可能性もある)
  prng.rand(0..4.2) # => 3.2397116600246867
  # 0 から 4.2までの実数が得られる (4.2 は除く)
  prng.rand(0...4.2) # => 3.6148130397862865
  # 2012年のすべての(秒単位)時刻から一つ選ばれる
  prng.rand(Time.new(2012, 1, 1) ... Time.new(2013,1,1)) # => 2012-02-25 03:11:42 +0900
  require 'date'
  prng.rand(Date.new(2012, 1, 1) ... Date.new(2013,1,1)) # => #<Date: 2012-01-31 ((2455958j,0s,0n),+0s,2299161j)>
  # Kernel.#rand とほぼ同様の使い勝手
  prng = Random.new(1234)
  prng.rand            # => 0.1915194503788923
  srand(1234)
  rand                 # => 0.1915194503788923
  
  # max に実数も指定出来る
  prng.rand(6.5)       # => 4.043707011758907
  # (rand(6) と同等)
  rand(6.5)            # => 5

  # 引数には Range も指定できる
  # 0 から 10までの整数が得られる
  prng.rand(0..10) # => 4
  # 0 から 9までの整数が得られる
  prng.rand(0...10) # => 8
  # 0 から 4.2までの実数が得られる (4.2 が得られる可能性もある)
  prng.rand(0..4.2) # => 3.2397116600246867
  # 0 から 4.2までの実数が得られる (4.2 は除く)
  prng.rand(0...4.2) # => 3.6148130397862865
  # 2012年のすべての時刻から一つ選ばれる
  # Time#- は秒数を float で返すため。
  prng.rand(Time.new(2012, 1, 1) ... Time.new(2013,1,1)) # => 2012-02-25 03:11:42 +0900
  # DateTime ではうまくいかない。というのは DateTime#- は
  # Rational を返すため。
  # Date#- も Rational を返すが通常は整数を表す Rational オブジェクトを返すためうまくいくように見える
  
  # 上と同じ種で再初期化
  prng = Random.new(1234)
  srand(1234)
  # Kernel.#rand は Array#sample などの影響を受けて値がずれることがある
  [0, 1].sample
  prng.rand            #=> 0.1915194503788923
  rand                 #=> 0.6221087710398319

  
@see [[m:Kernel.#rand]]

