有没有更有效的方法来计算百分比

Is there a more efficient way to calculate percentages?

本文关键字:计算 百分比 方法 有效 有没有      更新时间:2023-10-16

我正在使用boost/random.hpp用区间[1,3]上的随机数填充std::map,并将每个计数的百分比与生成的数字总数相加,但我正在寻找一种可能更有效的方法。我一直试图在boost库中找到一些东西,但很难找到完全相关的东西;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.
}

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

你说你不想更改映射类型,但我认为没有太多理由在这项工作中使用映射。似乎显而易见的选择是一个向量:

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;

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

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