Ruby 2.3.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 raw_seed srand
インスタンスメソッド
== bytes rand seed
private特異メソッド
left state
privateメソッド
left marshal_dump marshal_load 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 の境界は数値でなければなりません。
[EXCEPTION] Errno::EDOM:
rand(1..Float::INFINITY) などのように範囲に問題があるときに発生します。
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

raw_seed(size) -> String[permalink][rdoc]

プラットフォームの提供する機能を使って、文字列を返します。

[PARAM] size:
結果の文字列のサイズをバイト数で指定します。
[RETURN]
返り値はバイナリ形式で、暗号的に安全な擬似乱数だと期待できます。
[RETURN]
プラットフォームの提供する機能の準備に失敗した場合は nil を返します。

2017年の時点で、Linuxのmanpage(random(7))には「今日256ビット以上の セキュリティを約束できる暗号化プリミティブが入手可能だとは期待できません」と 書いてあります。そのため、sizeとして32より大きい値を指定することには疑問の 余地があります。

例:

Random.raw_seed(8)  #=> "\x78\x41\xBA\xAF\x7D\xEA\xD8\xEA"
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/"
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 を参照してください。

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

state -> Integer[permalink][rdoc]

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

定数

DEFAULT -> Random[permalink][rdoc]

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

[SEE_ALSO] Random.srand, Kernel.#srand