【问题标题】:Generating set of "N" numbers in an integer range at "logarithmic" distance in C++在C ++中以“对数”距离生成整数范围内的“N”个数字集
【发布时间】:2013-07-14 12:32:23
【问题描述】:

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

【问题讨论】:

  • “等对数距离”是什么意思?您能否提供少量输入的预期答案?
  • 需要更多std::iota。
  • @hivert 抱歉,很难明确指定,但类似 ​​log2 "8, 16, 32, 64, 128, 256, ..." 的间隙也可能是 log10

标签: c++ c arrays algorithm


【解决方案1】:

您可以为此目的使用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]);
}

【讨论】:

    【解决方案2】:

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

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

    原来解是 HIGH/LOW 的第 N 个根。

    【讨论】:

      猜你喜欢
      • 2010-10-20
      • 2018-12-17
      • 2011-05-16
      • 1970-01-01
      • 2013-04-04
      • 2010-09-22
      相关资源
      最近更新 更多