Java 如何将一个范围划分为n个相等的容器?

Java 如何将一个范围划分为n个相等的容器?,java,algorithm,data-structures,Java,Algorithm,Data Structures,我有一个范围[最小-最大]。最小值和最大值的类型为double。我想把这个间隔分成n个相等的间隔。(n是一个整数)。如何在Java中实现这一点 例如: 假设我有一个范围[10-50]。和n=4。 输出应该是一个范围列表,如[10-20][20-30][30-40][40-50]您可以使用@Achtya使用的内容,双距离=(双)(最大-最小)/n然后从最小值开始,将dist添加到它,这就是第一次间隔的最大值 所以它应该是这样的: [min,min+dist],[min+dist,min+2*dis

我有一个范围[最小-最大]。最小值和最大值的类型为
double
。我想把这个间隔分成n个相等的间隔。(n是一个整数)。如何在Java中实现这一点

例如: 假设我有一个范围
[10-50]
。和
n=4

输出应该是一个范围列表,如
[10-20][20-30][30-40][40-50]
您可以使用@Achtya使用的内容,
双距离=(双)(最大-最小)/n然后从最小值开始,将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;
    }
}

这里需要的是一个小范围极限的公式。首先,让我们从计算每个小范围的长度开始:

// 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;
}
双电流启动=启动;
对于(int i=0;i
如果以两个元素(最小值和最大值)的数组形式给出范围

你可以这样试试。从
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;
}
public double[]divideRange(双[]range,n){
双精度[][]范围=新的双精度[n][2];
双长度=(范围[1]-范围[0])/n;
范围[0][0]=范围[0];
范围[0][1]=范围[0]+长度;
对于(int i=1;i
double interval=(double)(max-min)/n;你只是想平均分配还是随机分配?@Achtyajha我已经更新了这个问题。如果你继续将dist添加到最小值,你将在大量范围内得到舍入误差。最好将距离计数乘以距离,然后再加上最小值,得到当前的最小距离。@GilbertLeBlanc对不起,我不太明白你说的两种方法之间的区别。我意识到,由于dist是一个四舍五入的双精度运算,我会得到大量范围的舍入误差,但是你能再解释一下你提到的第二种方式吗?我想他只是指通过
计数器
进行多个
dist
,因为这是一个操作,而不是进行多个
dist
相加,每个都有舍入误差。我不能证明这个说法的真实性。。。只是会有更少的操作(我不清楚这意味着舍入误差会更少)。没关系。我看到你在做我描述的代码。我错了。如果数字可以是负数呢?e、 g.从-32768到+32767@KamilDziedzic没有理由不使用负数。但是,请确保结束和开始之间的差异不会溢出您正在使用的类型,例如short和您提供的间隔可能溢出
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;
}