我正在使用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.
}
编辑:我不想以任何方式更改地图容器。
答案 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]
。