[英]Split a range of number to a specific number of intervals
我有一个区间[0; max]
[0; max]
,我想把它分成特定数量的子区间。 为此,我写了一个名为getIntervalls(max, nbIntervals)
的 function,其中max
是我的第一个间隔中的最大元素, nbIntervals
是预期子间隔的数量。
例如:
getIntervalls(3, 2)
应该返回[[0,1], [2,3]]
,getIntervalls(6, 2)
应该返回[[0,3], [4,6]]
,getIntervalls(8, 3)
应该返回[[0,2], [3,5], [6,8]]
,getIntervalls(9, 3)
应该返回[[0,3], [4,7], [8,9]]
,这是我的 function:
function getIntervalls(max, nbIntervalls) {
var size = Math.ceil(max / nbIntervalls);
var result = [];
if (size > 1) {
for (let i = 0; i < nbIntervalls; i++) {
var inf = i + i * size;
var sup = inf + size < max ? inf + size: max;
result .push([inf, sup]);
}
} else {
result.push([0, max]);
}
return result;
}
console.log(JSON.stringify(getIntervalls(7, 2)));
它工作正常,并显示这个 output:
[[0,4],[5,7]]
当我将参数更改为 7 和 3 时,它显示:
[[0,3],[4,7],[8,7]]
代替
[[0,2],[3,5],[6,7]]
任何人都可以帮助我吗? 先感谢您。 ES6 语法将不胜感激::)
您需要使用Math.round()
获取最接近间隔size
的十进制数的整数。 此外,您需要减小一个max
进行size
计算,以考虑有效的间隔数。
这里修改你的代码:
function getIntervalls(max, nbIntervalls) {
var size = Math.round((max-1) / nbIntervalls);
var result = [];
for (let i = 0; i < nbIntervalls; i++) {
var inf = i + i * size;
var sup = inf + size < max ? inf + size: max;
result.push([inf, sup]);
if(inf >= max || sup >= max)break;
}
return result;
}
注意它尊重所需的间隔数,因此可能会产生一些数字的情况
[..., [n-2,n-1], [n,n]]
。
希望这可以帮助!
您需要更改从尺寸计算Math.ceil()
来Math.floor()
因为ceil
需要的尺寸比+1你所需要的。
我已经修改了你的代码,在这里它会工作。
function getIntervalls(max, nbIntervalls) {
var size = Math.floor(max / nbIntervalls);
var result = [];
if (size > 0) {
for (let i = 0; i < nbIntervalls; i++) {
var inf = i + i * size;
var sup = inf + size < max ? inf + size : max;
result .push([inf, sup]);
if (sup >= max) {
break;
}
}
} else {
result.push([0, max]);
}
return result;
}
console.log(JSON.stringify(getIntervalls(10, 5)));
希望这可以帮助!
您可以检查第一个元素的i
是否为零,如果下一个增量大于第二个元素的最大值。 您还可以检查第一个元素是否小于最大值。
function getIntervalls(max, nInt) { const c = Math.floor(max / nInt); const r = []; for (var i = 0; i <= max; i += c) { const a = i == 0 ? i : i += 1; const b = i + c > max ? max : i + c; if (a < max) r.push([a, b]) } return r; } console.log(JSON.stringify(getIntervalls(3, 2))); console.log(JSON.stringify(getIntervalls(6, 2))); console.log(JSON.stringify(getIntervalls(8, 3))); console.log(JSON.stringify(getIntervalls(9, 3))); console.log(JSON.stringify(getIntervalls(7, 2))); console.log(JSON.stringify(getIntervalls(7, 3)));
对我来说,这是完美的 function。
它允许您获得两个数字之间的间隔,并且最后一个间隔总是达到最大值。
function getIntervals(min, max, nbIntervals) {
let size = Math.floor((max - min) / nbIntervals);
let result = [];
if (size <= 0) return [min, max];
for (let i = 0; i < nbIntervals; i++) {
let inf = min + (i * size);
let sup = ((inf + size) < max) ? inf + size : max;
if (i === (nbIntervals - 1)) {
if (sup < max) sup = max;
}
result.push([inf, sup]);
if (sup >= max) break;
}
return result;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.