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

时间:2012-02-12 14:29:22

标签: c++ math boost

我正在使用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.
}

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

3 个答案:

答案 0 :(得分:3)

你说你不想改变地图类型,但我认为没有太多理由使用地图来完成这项工作。似乎明显的选择是矢量:

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 :(得分:2)

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

答案 2 :(得分:1)

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