【问题标题】:Is there a more efficient way to calculate percentages?有没有更有效的方法来计算百分比?
【发布时间】:2012-02-12 14:29:21
【问题描述】:

我正在使用 boost/random.hpp 用区间 [1,3] 上的随机数填充 std::map 并有一种组合在一起的东西,这些东西会给我每个计数相对于生成数字的总量,但正在寻找一种可能更有效的方法。我一直在尝试在 boost 库中找到一些东西,但找不到完全相关的东西;有什么东西可以使用我的地图(我不想更改我的地图类型)并计算百分比或其他我应该考虑的东西吗?

int main()
 {
    std::map <int, long> results;
    int current;
    long one = 0;
    long two = 0;
    long three = 0;
    long total = 0;

    boost::random::mt19937 rng;
    rng.seed(static_cast<boost::uint32_t> (std::time(0)));
    boost::random::uniform_int_distribution<int> random(1,3);

    for (int n = 0; n < 1000000; ++n)
    {
        current = random(rng);
        ++total;

        switch (current)
        {
            case 1:
                ++one;
                break;
            case 2:
                ++two;
                break;
            case 3:
                ++three;
                break;
        }
    }

    results[1] = one;
    results[2] = two;
    results[3] = three;

    std::cout << (double) results[1]/total*100 << std::endl; // etc.
}

编辑:我不想以任何方式更改地图容器。

【问题讨论】:

标签: c++ math boost


【解决方案1】:

您说您不想更改地图类型,但我认为没有太多理由使用地图来完成这项工作。似乎显而易见的选择是向量:

static const unsigned total = 1000000;

std::vector<unsigned> values(3);

for (int i=0; i<total; i++)
    ++values[random(rng)-1];

for (int i=0; i<values.size(); i++)
    std::cout << (values[i] * 100.0) / total;

【讨论】:

    【解决方案2】:

    你为什么不分析它?在您知道它如何影响整个程序的速度之前,优化百分比部分是没有意义的。例如,如果百分比部分只占用程序时间的 1%(大部分时间花在随机数生成上),那么即使将效率提高一倍,速度也只会提高 0.5%。

    【讨论】:

      【解决方案3】:

      高效?丢弃地图并将results声明为4个元素的数组:int results[4] = {0};,而不是使用switch/case,您可以直接使用++results[current]。

      【讨论】:

      • 我不想更改 map 部分。除了地图有什么我可以做的吗?
      猜你喜欢
      • 2019-08-13
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多