Ruby 2.4.0 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > Randomクラス

class Random

クラスの継承リスト: Random < Object < Kernel < BasicObject

要約

MT19937に基づく疑似乱数生成器を提供するクラスです。

参考

オリジナル版 http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html

目次

特異メソッド
new new_seed rand srand
インスタンスメソッド
== bytes marshal_dump marshal_load rand seed
private特異メソッド
left state
privateメソッド
left state
定数
DEFAULT

特異メソッド

new(seed = Random.new_seed) -> Random[permalink][rdoc]

メルセンヌ・ツイスタに基づく疑似乱数発生装置オブジェクトを作ります。 引数が省略された場合は、Random.new_seedの値を使用します。

[PARAM] seed:
疑似乱数生成器の種を整数で指定します。

動作例: 種が同じなら同じ乱数列を発生することができる。

prng = Random.new(1234)
[ prng.rand, prng.rand ]   #=> [0.1915194503788923, 0.6221087710398319]
[ prng.rand(10), prng.rand(1000) ]  #=> [4, 664]
# 同じ乱数列を発生する。
prng = Random.new(1234)
[ prng.rand, prng.rand ]   #=> [0.1915194503788923, 0.6221087710398319]
[ prng.rand(10), prng.rand(1000) ]  #=> [4, 664]
new_seed -> Integer[permalink][rdoc]

適切な乱数の種を返します。

使用例:

p Random.new_seed # => 184271600931914695177248627591520900872
rand -> Float[permalink][rdoc]
rand(max) -> Integer | Float
rand(range) -> Integer | Float | nil

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

Random::DEFAULT.rand と同じです。 Random#rand を参照してください。

疑似乱数生成器が Kernel.#rand と共通なため Kernel.#srand などの影響を受けます。

[PARAM] max:
乱数値の上限を正の整数または実数で指定します。
[PARAM] range:
発生させる乱数値の範囲を Range オブジェクトで指定します。 range の境界は数値でなければなりません。
srand 1234 # 乱数の種を設定する。
Random.rand(10.0)  #=> 1.9151945037889229  (0.0 以上 10.0 未満の実数)
rand(10.0)         #=> 6                   (rand(10) と同じ)

[SEE_ALSO] Random.srand, Random#rand, Random::DEFAULT

srand -> Integer[permalink][rdoc]
srand(number) -> Integer

デフォルトの擬似乱数生成器の種を設定し、古い種を返します。 Kernel.#srand と同じです。

[PARAM] number:
疑似乱数発生器の種を整数で指定します。

[SEE_ALSO] Kernel.#rand, Random::DEFAULT

インスタンスメソッド

self == other -> bool[permalink][rdoc]

乱数生成器が等しい状態であるならばtrue を返します。

[PARAM] other:
比較対象の乱数生成器

動作例:

r1 = Random.new(1)
r2 = Random.new(1)

p r1 == r2 # => true
r2.rand
p r1 == r2 # => false
r1.rand
p r1 == r2 # => true
bytes(size) -> String[permalink][rdoc]

ランダムなバイナリー文字列を返します。結果の文字列のサイズを指定できます。

[PARAM] size:
結果の文字列のサイズを指定します。

動作例:

r2 = Random.new(1)
p r2.bytes(10) # => "%\xF4\xC1j\xEB\x80G\xFF\x8C/"
marshal_dump -> Array[permalink][rdoc]

Random#marshal_load で復元可能な配列を返します。

動作例:

r1 = Random.new(1)
a1 = r1.marshal_dump
r2 = Random.new(3)
p r1 == r2 # => false
r3 = r2.marshal_load(a1)

p r1 == r2 # => true
p r1 == r3 # => true
marshal_load(array) -> Random[permalink][rdoc]

Random#marshal_dump で得られた配列を基に、Randomオブジェクトを復元します。

[PARAM] array:
三要素以下からなる配列を指定します。 何を指定するかはRandom#marshal_dumpを参考にしてください。
[EXCEPTION] ArgumentError:
array が3より大きい場合に発生します。

動作例:

r1 = Random.new(1)
a1 = r1.marshal_dump
r2 = Random.new(3)
r3 = r2.marshal_load(a1)

p r1 == r2 # => true
p r1 == r3 # => true

[SEE_ALSO] Random#marshal_dump

rand -> Float[permalink][rdoc]
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 が Time の場合などにもうまく動作します。

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

[PARAM] max:
乱数値の上限を正の整数または実数で指定します。 max 自体は乱数値の範囲に含まれません。
[PARAM] range:
発生させる乱数値の範囲を Range オブジェクトで指定します。 range.end - range.begin は数値である必要があり、 range.begin + 数値 が適切な値を返す必要があります。
[EXCEPTION] 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_ALSO] Kernel.#rand

seed -> Integer[permalink][rdoc]

現在の乱数の種を返します。

動作例:

p Random.new(3).seed # => 3

private特異メソッド

left -> Integer[permalink][rdoc]

C言語レベルで定義されている構造体MTの静的変数default_randの変数leftを参照します。詳しくはrandom.c を参照してください。

state -> Integer[permalink][rdoc]

C言語レベルで定義されている構造体MTの静的変数default_randの状態を参照します。詳しくはrandom.c を参照してください。

privateメソッド

left -> Integer[permalink][rdoc]

C言語レベルで定義されている構造体MTの変数leftを参照します。詳しくはrandom.c を参照してください。

state -> Integer[permalink][rdoc]

C言語レベルで定義されている構造体MTの状態を参照します。詳しくはrandom.c を参照してください。

定数

DEFAULT -> Random[permalink][rdoc]

デフォルトの疑似乱数生成器です。 Random.randKernel.#rand などで使用されます。

[SEE_ALSO] Random.srand, Kernel.#srand