標準的な乱数生成方法
言語、標準ライブラリで用意されている乱数の生成方法
望ましい乱数取得方法とは異なる。
ShellScript
bash, zsh の場合は $RANDOM 変数に乱数が設定される。
0から32767の数値が読み出す度に得られる。
それ以外の実行系の ShellScript その物には乱数を生成する仕組みは存在しない。
Unix 系では、/dev/urandom, /dev/random から乱数列が手に入る。
/dev/random はOS内のあちこちからエントロピーを取得してランダム性を確保する。このためエントロピーが枯渇すると止まることがある。
/dev/urandom はエントロピーが枯渇しても、動き続ける。(この場合、特定の疑似乱数アルゴリズムに従ってしまう。)
実際の利用では、/dev/urandom でほぼ十分とされている。
/dev/random, /dev/urandom は乱数のオクテット列になるので、必要なオクテット数だけ読み出して使う。
パイプを使って切り出す場合、一見するとバイト単位で読み出しているように見えるが、実際にはバッファ単位で読み出されていることが多い。このため、エントロピーの枯渇が起きやすい。大量に使う場合には正確な切り出しをする必要がある。
C/C++
rand 関数
0 以上 MAX_RAND 未満の整数を返す。
srand 関数
乱数のシードを設定する。
乱数の品質は最悪レベルなので代替関数を用意すべき。
code:random.c
int main(int argc, char *argv[]) {
int i;
// 乱数のシードを設定
srand((unsigned int) time(NULL));
for (i = 0; i < 100; i++) {
printf("%d\n", rand());
}
return EXIT_SUCCESS;
}
JavaScript
Math.random()
0以上1未満の倍精度浮動小数点数(IEEE 754)
シードを設定することはできない。このため、シードで乱数を作りたい場合は標準以外の方法が必要となる。
code:random.js
//
const r = Math.random();
V8エンジンでは、現在は xorshift128+ で実装されている。
Julia
code:random.jl
# 0 ≦ r < 1 の一様乱数を生成(デフォルトでFloat64型)
r = rand()
# 整数型を指定するとその型の定義域で生成する。
r = rand(Int64)
# 次元を指定することができる。
# 10要素の Float64 型ベクトル(シードでも範囲でもないことに注意)
r = rand(10)
# 2要素の Float64 型ベクトル
r = rand(Float64, 2)
# Float64 型の2x3行列
r = rand(Float64, (2, 3))
# RNG (Random Number Generator、乱数生成器) を選ぶことができる。
# デフォルトは Xoshiro (Xoshiro256++)
# RNG にシードを渡すことができる。
using Random
rng = MersenneTwister(1234)
r = rand(rng, Int64, 2)
PHP
メルセンヌツイスター
関連