4

我找不到这个问题的确切答案,所以我把它贴在这里:如果我有一个整数范围,我想以相等的对数距离计算这个范围内的“N”个数字。

这是一个示例代码,用于在相等的“非对数”距离(或多或少)处查找数字:

const int N = 100; // total no of sizes to generate
const int LOW = 10; // range low-bound
const int HIGH = 1000000; // range upper-bound
int SIZES[N];
int GAP = (HIGH-LOW)/N;
SIZES[0] = LOW + GAP;
for(int i=1; i<N; ++i)
{
   SIZES[i] = SIZES[i-1] + GAP;
}

但是,我想在“对数”距离的这个范围内找到“N”个数字。

4

2 回答 2

10

我只能猜测您真正想要的是对数刻度。

在这种情况下,不是添加一个常量GAP,而是乘以一个常量FACTOR。FACTOR 可以通过求解方程来LOW*FACTOR^N=HIGH找到FACTOR

事实证明,解决方案是 HIGH/LOW 的第 N 个根。

于 2013-07-16T10:56:54.900 回答
2

为此,您可以使用log和函数。exp为避免舍入问题,对double数据类型进行操作可能是更好的选择。

函数log给出自然对数,但使用除数字以外的任何其他基数e(如 log10() )也会给出相同的结果,因为对于给定的间隔,只有一组具有相等对数距离的唯一数字:

#include <math.h>       /* log & exp & round */

const double N = 100; // total no of sizes to generate
const double LOW = 10; // range low-bound
const double HIGH = 1000000; // range upper-bound
double SIZES[N];
double GAP = (log(HIGH)-log(LOW))/N;
SIZES[0] = LOW*exp(GAP);
for(int i=1; i<N; ++i)
{
   SIZES[i] = (SIZES[i-1]*exp(GAP));
}

//rounding
for(int i=1; i<N; ++i)
{
   SIZES[i] = round(SIZES[i]);
}
于 2013-07-16T11:00:08.893 回答