我应该保留随机分发对象实例还是可以随时重新创建它?

Alb*_*ert 13 c++ random c++11

我有这个代码:

static std::mt19937 rnd;

// ...

static uint32_t rndInt(uint32_t min, uint32_t max) {
    return std::uniform_int_distribution<uint32_t>(min,max)(rnd);
}
Run Code Online (Sandbox Code Playgroud)

这是好的做法还是应该存储uniform_int_distribution

Ste*_*sop 9

我怀疑分发对象的创建和销毁成本很高,尽管我认为它可能比存储参数稍微多一些min,max.它可能会根据参数预先计算一些有用的值,例如,显而易见的实现2**32 % (max-min+1)是生成器中将被丢弃和重新尝试的不同值的数量.

原则上,允许分发对象在其内部存储一些熵,这些熵是在先前调用时从生成器中提取的operator(),但不是必需的.这些位可以用于以后的operator()调用.因此,如果min==0max==1,那么你可以operator()在发电机的每个呼叫上进行32 次呼叫.这就是该reset()功能的用途,以清除这种状态.

所以,如果你重复使用相同的最小值/最大值,然后在技术上你的每一次使用新的分配浪费随机位 - 你也许可以最终用更少的调用引擎比,如果你不停地围绕着分配的对象.但我怀疑这很重要,特别是因为MT很快.