rand -> Float
[permalink][rdoc][edit]rand(max) -> Integer | Float
rand(range) -> Integer | Float
-
一様な擬似乱数を発生させます。
最初の形式では 0.0 以上 1.0 未満の実数を返します。
二番目の形式では 0 以上 max 未満の数を返します。 max が正の整数なら整数を、正の実数なら実数を返します。 0 や負の数を指定することは出来ません。
三番目の形式では range で指定された範囲の値を返します。 range の始端と終端が共に整数の場合は整数を、少なくとも片方が実数の場合は実数を返します。 rangeが終端を含まない(つまり ... で生成した場合)には終端の値は乱数の範囲から除かれます。 range.end - range.begin が整数を返す場合は range.begin + self.rand((range.end - range.begin) + e) の値を返します(e は終端を含む場合は1、含まない場合は0です)。 range.end - range.begin が実数を返す場合も同様です。このため range が Time の場合などにもうまく動作します。
引数が実数でも範囲でもない場合は Object#to_int で変換した値が指定されたものとして扱います。
- [PARAM] max:
- 乱数値の上限を正の整数または実数で指定します。 max 自体は乱数値の範囲に含まれません。
- [PARAM] range:
- 発生させる乱数値の範囲を Range オブジェクトで指定します。 range.end - range.begin は数値である必要があり、 range.begin + 数値 が適切な値を返す必要があります。
- [EXCEPTION] Errno::EDOM:
- rand(1..Float::INFINITY) などのように範囲に問題があるときに発生します。
- [EXCEPTION] ArgumentError:
- 引数の数が0または1では無い時、引数に負の数値を与えた時や (1..0) のような値が存在しない範囲を渡した時などに発生します。
# 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_ALSO] Kernel.#rand