如何生成加起来为一定数且生成在JavaScript范围内的随机数?
How to generate random numbers that add up to a certain number and are generated in a range in 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;
}
这有时会 return 个 NaN
或大于 40(必须是最大值)的数字
或小于 15(必须是最小值)甚至小于 0。
它生成的数字加起来是另一个介于 110 或 150 之间的随机数。
如何让它加起来和总随机数还在一定范围内?
我们必须确保有可能达到最小总数的数字,以及不能超过最大总数的数字。
对于每个数字,重新计算其最小值和最大值,以便仍然可以达到预期的总和。
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;
}
为了完整起见,我应该指出有几种可能的方法可以选择概率分布。这种方法至少保证了每一种可能的整数组合都有非零的概率。
我正在尝试制作它生成 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;
}
这有时会 return 个 NaN
或大于 40(必须是最大值)的数字
或小于 15(必须是最小值)甚至小于 0。
它生成的数字加起来是另一个介于 110 或 150 之间的随机数。
如何让它加起来和总随机数还在一定范围内?
我们必须确保有可能达到最小总数的数字,以及不能超过最大总数的数字。
对于每个数字,重新计算其最小值和最大值,以便仍然可以达到预期的总和。
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;
}
为了完整起见,我应该指出有几种可能的方法可以选择概率分布。这种方法至少保证了每一种可能的整数组合都有非零的概率。