ウェブサイト検索

JavaScriptで、特定の数に合計され、かつ指定した範囲内で生成されるランダムな数を生成する方法は?


私はこれを作ろうとしています、それは7つのランダムな数字を生成するものです。私は使っています

function getRandomInt(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

function generateNum(max, thecount) {
    var r = [];
    var currsum = 0;
    for (var i = 0; i < thecount - 1; i++) {
        r[i] = getRandomInt(15, max - (thecount - i - 1) - currsum);
        currsum += r[i];
    }
    r[thecount - 1] = max - currsum;


    return r;

}

これは時々、NaN の数値や 40 を超える数値(これが最大である必要があります)を返すことがあります

または15未満(これが最小である必要があります)で、さらに0未満の場合。

それは、110から150の間のどこかにある別のランダムな数に合計される数字を生成します。

合計のランダムな数字に加えて、特定の範囲内に収めるにはどうすればいいですか?

回答 #1

私たちは、最小合計に到達できるような数値と、最大合計を超えないような数値が可能であることを確実にしなければなりません。

各数字について、意図した合計がまだ達成可能になるように、その最小値と最大値を再計算します。

function getRandomInt(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

function randomInts(n, min, max, minSum, maxSum) {
    if (min * n > maxSum || max * n < minSum) {
       throw 'Impossible';
    }

    var ints = [];
    while (n--) {
        // calculate a lower bound for this number
        // n * max is the max of the next n numbers
        var thisMin = Math.max(min, minSum - n * max);
        // calculate an upper bound for this number
        // n * min is the min of the next n numbers
        var thisMax = Math.min(max, maxSum - n * min);

        var int = getRandomInt(thisMin, thisMax);
        minSum -= int;
        maxSum -= int;
        ints.push(int);
    }
    return ints; 
}

完全性のために、確率分布を選ぶ方法はいくつかあることを指摘しておくべきです。この方法は少なくとも、整数のすべての可能な組み合わせがゼロでない確率を持つことを保証します。