【问题标题】:How can I divide a range into n equal bins?如何将一个范围划分为 n 个相等的 bin?
【发布时间】:2013-04-19 15:43:39
【问题描述】:

我有一个范围 [min-max]minmax 的类型为 double。我想把这个间隔分成n个相等的间隔。(n是一个整数)。我怎样才能在 Java 中实现这一点?

例如: 说我有一个范围[10-50]。和n=4。 输出应该是一个范围列表,如[10-20] [20-30][30-40] [40-50]

【问题讨论】:

  • 双间隔 = (double)(max-min)/n;
  • 你是要平均分配还是随机分配?
  • @AchintyaJha 我已经更新了问题。

标签: java algorithm data-structures


【解决方案1】:

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

// 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
  • @KamilDziedzic 没有理由不使用负数。但是请确保结束和开始之间的差异不会溢出您正在使用的类型 - 例如,您提供的时间间隔可能会溢出
【解决方案2】:

如果范围以包含两个元素(最小值和最大值)的数组形式给出

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;
}

【讨论】:

    【解决方案3】:

    你可以做的是使用@Achintya 使用的,double dist = (double)(max-min)/n; 然后从最小值开始,将 dist 添加到它,这是你的第一个间隔的最大值。

    所以它会是这样的: [min, min + dist], [min + dist, min + 2*dist]... 直到 min + n*dist &gt;= 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,然后将其添加到最小值以获得当前范围最小值。
    • @GilbertLeBlanc 对不起,我不太明白你所说的两种方式之间的区别。我意识到由于 dist 是一个四舍五入的双精度数,我会在大量范围内得到舍入错误,但你能解释一下你提到的第二种方式吗?
    • 我认为他只是指多个dist by counter,因为这是一个操作,而不是执行多个dist 添加每个都有舍入错误。我无法证明这一说法的真实性……只是操作会减少(对我来说,这并不意味着舍入误差会减少)。
    • 没关系。我看到你在我描述的代码中做的。我的错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 2011-12-16
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多