Java での乱数生成についてのメモです。
- Java 1.8
- Apache Commons Math 3.6.1
以下の条件を満たす乱数。
- 偏りが無い
- 規則性が無い
- 再現性が無い
ソフトウェアだけでは真の乱数は生成できないが、ハードウェアを使えば出来る。
具体的には、音や熱などの自然現象をセンサーで検知するなどして生成が可能。
一見すると乱数列のように見えるが、実際には確定的な計算によって求めている擬似乱数列による乱数。
擬似乱数を生成する機器を擬似乱数生成器(Pseudo-Random Number Generator: PRNG)、生成アルゴリズムを擬似乱数生成法とよぶ。
生成アルゴリズムの違いにより、周期性や分布の精度が異なる。
種(シード)に同じ値を設定することで、同じ乱数列を再現することが可能。
0 と 1(あるいは -1 と 1)がランダムに現れるような乱数。
ある区間(例えば [0,1])のすべての数値の出現確率が等しい乱数。
擬似乱数列生成器としては、メルセンヌ・ツイスタ(Mersenne twister、通称 MT)が有名。
正規分布(ガウス分布)を持つような乱数。
一様乱数をボックス=ミュラー法(Box-Muller transform)で変換することにより正規乱数を得ることができる。
一連の擬似乱数を生成するための乱数ジェネレータ。
スレッドセーフではあるが、複数のスレッドで同じインスタンスを並行して使用すると、競合が発生してパフォーマンスが低下する可能性がある。
一様分布の boolean/int/long/float/double
型の擬似乱数値を生成可能。
平均 0.0、標準偏差 1.0 の正規(ガウス)分布の double
型の擬似乱数値を生成可能。
Java 1.7 で追加された、現在のスレッドから独立した隔離された乱数ジェネレータ。
一様分布の boolean/int/long/float/double
型の擬似乱数値を生成可能。
平均 0.0、標準偏差 1.0 の正規(ガウス)分布の double
型の擬似乱数値を生成可能。
暗号用に強化された乱数ジェネレータ。
SHA1PRNG
アルゴリズムなどがある。
0.0 以上で 1.0 より小さい、正の符号の付いた double
値を返す。
戻り値は、この範囲からの一様分布によって擬似乱数的に選択されます。
内部では java.util.Random#nextDouble()
を呼び出している。
下記のような多数の擬似乱数列生成器を提供。
- Mersenne twister
- WELL(Well Equidistributed Long-period Linear)
- ISAAC(Indirection, Shift, Accumulate, Add, and Count)
- https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2%E4%B9%B1%E6%95%B0%E7%94%9F%E6%88%90%E5%99%A8
- https://ja.wikipedia.org/wiki/%E4%B9%B1%E6%95%B0%E5%88%97
- https://ja.wikipedia.org/wiki/%E6%93%AC%E4%BC%BC%E4%B9%B1%E6%95%B0
- https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Math.html#random