繁体   English   中英

将数字范围拆分为特定数量的间隔

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM