如何将一个范围分成n个相等的区间?

3
我有一个范围 [min-max],其中 min max double 类型。我想将此间隔分成n个等间隔(n为整数)。如何在Java中实现?
例如: 假设我有一个范围 [10-50] ,并且 n = 4 。 输出应该是一个范围列表,如 [10-20] [20-30] [30-40] [40-50]

双倍间隔=(double)(max-min)/n; - Achintya Jha
你只想平均分配它们还是也要随机分配? - vidit
3个回答

3

因此,你需要的是小范围限制的公式。首先,让我们计算每个小范围的长度:

// let range be [start, end]
// let the number of smaller ranges be n
double total_length = end - start;
double subrange_length = total_length/n;

接下来,对于较小的范围进行简单的循环,每一步将当前范围的左端移动到上面计算出的值:

double current_start = start;
for (int i = 0; i < n; ++i) {
  System.out.printl("Smaller range: [" + current_start + ", " + (current_start + subrange_length) + "]");
  current_start += subrange_length;
}

如果数字可以为负数呢?例如从-32768到+32767。 - Kamil Dziedzic
@KamilDziedzic 没有理由不支持负数。但是请确保结束和开始之间的差异不会超出您使用的类型 - 例如,对于短整型和您提供的区间,这可能会导致溢出。 - Ivaylo Strandjev

1
你可以使用@Achintya的方法:double dist = (double)(max-min)/n; 从min开始,加上dist就是第一个区间的最大值。
所以代码应该是这样的:[min, min + dist], [min + dist, min + 2*dist]... 直到 min + n*dist >= max.
int counter = 0;
while(true) {
    CreateInterval(min + counter*dist, min + (counter+1)*dist);
    if (min+(counter+1)*dist >= max) {
         //if we have reached the max, we are done
         break;
    }
}

如果你不断将dist加到最小值上,那么在大量范围内会产生舍入误差。更好的方法是将范围计数乘以dist,然后将其加到最小值上以得到当前范围的最小值。 - Gilbert Le Blanc
@GilbertLeBlanc 对不起,我不太明白你所说的两种方式之间的区别。我意识到由于dist是一个四舍五入的双精度浮点数,对于大量范围会产生舍入误差,但你能否更详细地解释一下你提到的第二种方式? - masotann
我认为他的意思是将多个dist乘以counter,因为这是一次操作,而不是进行多个dist加法运算,每个运算都会产生舍入误差。我无法证明这种说法的真实性...只能说会有更少的操作(对我来说并不明显这意味着会有更少的舍入误差)。 - rliu
没关系,我看到你的代码已经按照我描述的做了。是我错了。 - Gilbert Le Blanc

1
如果以包含两个元素(最小值和最大值)的数组形式给出范围。
double[] range = new double[] {min, max};
int n = 4;

你可以尝试这种方法。从divideRange得到的是一个二维数组,其中包含给定范围的子范围,每个子范围都具有所需的长度。
public double[][] divideRange(double[] range, n) {
    double[][] ranges = new double[n][2];
    double length = (range[1] - range[0])/n;
    ranges[0][0] = range[0];
    ranges[0][1] = range[0]+length;
    for(int i = 1; i < n; i++) {
        ranges[i][0] = ranges[i-1][1];
        ranges[i][1] = ranges[i-1][1]+length;
    }

    return ranges;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接