Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Random Number Generation in Java

Random Number Generation in Java

Java での乱数生成についてのメモです。

Environment

  • Java 1.8
  • Apache Commons Math 3.6.1

真の乱数と擬似乱数

真の乱数 (True random numbers)

以下の条件を満たす乱数。

  • 偏りが無い
  • 規則性が無い
  • 再現性が無い

ソフトウェアだけでは真の乱数は生成できないが、ハードウェアを使えば出来る。
具体的には、音や熱などの自然現象をセンサーで検知するなどして生成が可能。

擬似乱数 (Pseudorandom numbers)

一見すると乱数列のように見えるが、実際には確定的な計算によって求めている擬似乱数列による乱数。
擬似乱数を生成する機器を擬似乱数生成器(Pseudo-Random Number Generator: PRNG)、生成アルゴリズムを擬似乱数生成法とよぶ。
生成アルゴリズムの違いにより、周期性や分布の精度が異なる。
種(シード)に同じ値を設定することで、同じ乱数列を再現することが可能。

乱数列の種類

2進乱数 (Binary random number)

0 と 1(あるいは -1 と 1)がランダムに現れるような乱数。

一様乱数 (Uniform random numbers)

ある区間(例えば [0,1])のすべての数値の出現確率が等しい乱数。
擬似乱数列生成器としては、メルセンヌ・ツイスタ(Mersenne twister、通称 MT)が有名。

正規乱数 (Normal random number)

正規分布(ガウス分布)を持つような乱数。
一様乱数をボックス=ミュラー法(Box-Muller transform)で変換することにより正規乱数を得ることができる。

乱数の生成法

Java SE

java.util.Random

一連の擬似乱数を生成するための乱数ジェネレータ。
スレッドセーフではあるが、複数のスレッドで同じインスタンスを並行して使用すると、競合が発生してパフォーマンスが低下する可能性がある。
一様分布の boolean/int/long/float/double 型の擬似乱数値を生成可能。
平均 0.0、標準偏差 1.0 の正規(ガウス)分布の double 型の擬似乱数値を生成可能。

java.util.concurrent.ThreadLocalRandom

Java 1.7 で追加された、現在のスレッドから独立した隔離された乱数ジェネレータ。
一様分布の boolean/int/long/float/double 型の擬似乱数値を生成可能。
平均 0.0、標準偏差 1.0 の正規(ガウス)分布の double 型の擬似乱数値を生成可能。

java.security.SecureRandom

暗号用に強化された乱数ジェネレータ。 SHA1PRNG アルゴリズムなどがある。

java.lang.Math#random()

0.0 以上で 1.0 より小さい、正の符号の付いた double 値を返す。
戻り値は、この範囲からの一様分布によって擬似乱数的に選択されます。
内部では java.util.Random#nextDouble() を呼び出している。

Apache Commons Math

org.apache.commons.math3.random

下記のような多数の擬似乱数列生成器を提供。

  • Mersenne twister
  • WELL(Well Equidistributed Long-period Linear)
  • ISAAC(Indirection, Shift, Accumulate, Add, and Count)

参考文献

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment