instance method Random#rand

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