class Random

[edit]

要約

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

参考

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

目次

特異メソッド
インスタンスメソッド
private特異メソッド
privateメソッド
定数

特異メソッド

bytes(size) -> String[permalink][rdoc][edit]

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

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

Random.bytes(10) # => "\xAC\n\x7F\x8C/\xAA\xC4\x97u\xA6"

[SEE_ALSO] Random#bytes

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

メルセンヌ・ツイスタに基づく擬似乱数発生装置オブジェクトを作ります。引数が省略された場合は、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][edit]

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



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

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

Random#rand を参照してください。

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

[PARAM] max:
乱数値の上限を正の整数または実数で指定します。
[PARAM] range:
発生させる乱数値の範囲を Range オブジェクトで指定します。 range の境界は数値でなければなりません。
[EXCEPTION] Errno::EDOM:
rand(1..Float::INFINITY) などのように範囲に問題があるときに発生します。
[EXCEPTION] ArgumentError:
引数の数が0または1では無い時、引数に負の数値を与えた時や (1..0) のような値が存在しない範囲を渡した時に発生します。


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][edit]
srand(number) -> Integer

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

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

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

urandom(size) -> String[permalink][rdoc][edit]

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

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

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



Random.urandom(8)  #=> "\x78\x41\xBA\xAF\x7D\xEA\xD8\xEA"

インスタンスメソッド

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

乱数生成器が等しい状態であるならば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][edit]

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

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


r2 = Random.new(1)
p r2.bytes(10) # => "%\xF4\xC1j\xEB\x80G\xFF\x8C/"

[SEE_ALSO] Random.bytes

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

seed -> Integer[permalink][rdoc][edit]

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



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

private特異メソッド

left -> Integer[permalink][rdoc][edit]

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

state -> Integer[permalink][rdoc][edit]

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

privateメソッド

left -> Integer[permalink][rdoc][edit]

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

marshal_dump -> Array[permalink][rdoc][edit]

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][edit]

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][edit]

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

定数

DEFAULT -> Class[permalink][rdoc][edit]

Ruby 3.0 から非推奨で,3.2で廃止されます。代わりに Random クラスオブジェクトを擬似乱数生成器として使用してください。

また、 Random::DEFAULT は Random クラスオブジェクトが返ります。


Random::DEFAULT == Random # => true
Random.rand(10) # => 4