Есть ли более эффективный способ расчета процентов? - PullRequest
0 голосов
/ 12 февраля 2012

Я использую boost / random.hpp, чтобы заполнить std :: map случайными числами на интервале [1,3], и получаю что-то вроде чего-то, что даст мне% от каждого счета по отношению кобщее количество сгенерированных чисел, но искал, возможно, более эффективный способ сделать это.Я пытался найти что-то в библиотеке наддува, но у меня возникли проблемы с поиском чего-то совершенно уместного;Есть ли что-то такое, что может использовать мою карту (я не хочу менять типы карт) и вычислять% или что-либо еще, что я должен учитывать?

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: я не делаюхотите изменить контейнер карты любым способом.

Ответы [ 3 ]

3 голосов
/ 12 февраля 2012

Вы говорите, что не хотите менять тип карты, но я не вижу особой причины использовать карту вообще для этой работы. Кажется, очевидным выбором будет вектор:

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 голосов
/ 12 февраля 2012

Почему вы не профилируете это? Нет смысла оптимизировать процентную часть, пока вы не узнаете, как это влияет на скорость программы в целом. Например, если процентная доля занимает всего 1% времени программы (большая часть расходуется на генерацию случайных чисел), то даже удвоение эффективности увеличит скорость всего на 0,5%.

1 голос
/ 12 февраля 2012

Эффективное?Откажитесь от карты и объявите results как массив из 4 элементов: int results[4] = {0};, и вместо использования switch / case вы можете напрямую сделать ++results[current].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...