整数で乱数を取得する
多くの乱数生成では、0から1未満の乱数が得られる。
これは数学的にはとても正しいが、応用時には整数として欲しいのが一般的である。
例えばサイコロのシミュレーションであれば、1~6の値が欲しい。
この時、generateRandomInt(1, 6) のように表記したい。
数学的には以下のようになる。
$ R: 乱数で得られた実数$ ( 0 \le R < 1 )
$ I_{min}:最小となる整数値
$ I_{max}:最大となる整数値
$ I:目的の整数
$ I = \lfloor R ( I_{max} - I_{min} + 1 ) \rfloor + I_{min}
code:generateRandomInt(r, imin, imax) {
function generateRandomInt(r, imin, imax) {
return Math.floor(r * (imax - imin + 1)) + imin;
}
整数の乱数から、整数を得る場合は、剰余を使うことが多い。
理論的には正しいが、偏りが出ることがある。特に最下位ビット(奇数と偶数)の偏りはよくある。
$ R: 乱数で得られた整数
$ I_{min}:最小となる整数値
$ I_{max}:最大となる整数値
$ I:目的の整数
$ I = ( R \bmod ( I_{max} - I_{min} ) ) + I_{min}
code:generateRandomIntFromInt(r, imin, imax) {
function generateRandomInt(r, imin, imax) {
const m = mod(r, imax - imin);
return m + imin;
}