みさご解体新書

指定した範囲のランダムな値を返す

コード例

// min以上max未満のランダムな値を返す
export function range(min: number, max: number): number {
  return min + (max - min) * Math.random();
}

// min以上max以下のランダムな整数を返す
// max未満にしたい場合は下記の+1を削除する
export function rangeInt(min: number, max: number): number {
  min = Math.ceil(min);
  max = Math.floor(max);
  return Math.floor(range(min, max + 1));
}
import { range, rangeInt } from "./random";

console.log(range(0, 100)); // 79.59292871067693
console.log(rangeInt(0, 100)); // 11

ソースコード

random.ts / app.ts

解説/アルゴリズム

min ~ max の範囲は max - min で求める。

max - minMath.random() を掛けあわせ、 0 以上 max - min 未満の乱数を作る。

下限が 0 になっているので min を足し合わせることで、 min 以上 max - min + min 未満の乱数、つまり min 以上 max 未満の乱数を作る。

整数に変換をする場合はまず引数で渡された min と max を整数に変換する必要がある。

例えば min = 3 なら整数なので 3 のままだが、 3.2 のような値だと min 以上の整数に該当する最小値は 4 になる。なので min に対して切り上げ処理を行う。

同じように max も整数ならそのまま、 5.6 のような値だと max 以下の整数に該当する最大値は 5 になるので、 max に対して切り捨て処理を行う。

あとは min と max を range() に渡せばいいのだが、整数の乱数の場合、 min 以上 max 以下の範囲が便利だと思っているので、 range(min, max + 1) を渡すようにしている。

内部で利用しているアルゴリズム

擬似乱数, 天井関数, 床関数