1. ホーム
  2. javascript

[解決済み] JavaScriptで特定の範囲のランダムな整数を生成する?

2022-03-15 01:36:25

質問

JavaScript で、指定した 2 つの変数の間にランダムな整数を生成するには、どうすればよいでしょうか。 x = 4y = 8 のいずれかを出力します。 4, 5, 6, 7, 8 ?

解決方法は?

には、いくつかの例があります。 モジラデベロッパーネットワーク のページをご覧ください。

/**
 * Returns a random number between min (inclusive) and max (exclusive)
 */
function getRandomArbitrary(min, max) {
    return Math.random() * (max - min) + min;
}

/**
 * Returns a random integer between min (inclusive) and max (inclusive).
 * The value is no lower than min (or the next integer greater than min
 * if min isn't an integer) and no greater than max (or the next integer
 * lower than max if max isn't an integer).
 * Using Math.round() will give you a non-uniform distribution!
 */
function getRandomInt(min, max) {
    min = Math.ceil(min);
    max = Math.floor(max);
    return Math.floor(Math.random() * (max - min + 1)) + min;
}


その理屈はこうだ。シンプルな3つのルールです。

Math.random() が返されます。 Number 0 (包含) と 1 (排他) の間にある。つまり、このような区間ができるわけです。

[0 .................................... 1)

の間の数字が必要です。 min (含む) と max (排他的)です。

[0 .................................... 1)
[min .................................. max)

を使うことができます。 Math.random を使えば,[min, max]区間で対応するものを得ることができます.しかし,まず,問題を少し因数分解して min を2番目の区間から削除する。

[0 .................................... 1)
[min - min ............................ max - min)

これは、与える。

[0 .................................... 1)
[0 .................................... max - min)

を適用することができます。 Math.random を計算し、対応するものを算出します。乱数を選んでみよう。

                Math.random()
                    |
[0 .................................... 1)
[0 .................................... max - min)
                    |
                    x (what we need)

ということで、探すために x を行うことになります。

x = Math.random() * (max - min);

を忘れずに追加してください。 min を戻すと、[min, max]区間の数値が得られます。

x = Math.random() * (max - min) + min;

これがMDNにある最初の関数です。2つ目の関数は minmax は、両方を含む。

さて、整数を得るには、次のようにします。 round , ceil または floor .

を使うことができます。 Math.round(Math.random() * (max - min)) + min しかし、これは均等でない分布になります。両方です。 minmax は約半分の確率でしか転がりません。

min...min+0.5...min+1...min+1.5   ...    max-0.5....max
└───┬───┘└────────┬───────┘└───── ... ─────┘└───┬──┘   ← Math.round()
   min          min+1                          max

max を除外しているため、ロールする確率は min .

Math.floor(Math.random() * (max - min +1)) + min を使えば、完全に均等な分布になります。

min.... min+1... min+2 ... max-1... max.... max+1 (is excluded from interval)
|        |        |         |        |        |
└───┬───┘└───┬───┘└─── ... ┘└───┬───┘└───┬───┘   ← Math.floor()
   min     min+1               max-1    max

を使用することはできません。 ceil()-1 というのは、その式に max が出る可能性が少し低くなりましたが、(不要な) min-1 という結果も得られます。