我有这个代码:
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
?
我怀疑分发对象的创建和销毁成本很高,尽管我认为它可能比存储参数稍微多一些min,max
.它可能会根据参数预先计算一些有用的值,例如,显而易见的实现2**32 % (max-min+1)
是生成器中将被丢弃和重新尝试的不同值的数量.
原则上,允许分发对象在其内部存储一些熵,这些熵是在先前调用时从生成器中提取的operator()
,但不是必需的.这些位可以用于以后的operator()
调用.因此,如果min==0
和max==1
,那么你可以operator()
在发电机的每个呼叫上进行32 次呼叫.这就是该reset()
功能的用途,以清除这种状态.
所以,如果你重复使用相同的最小值/最大值,然后在技术上你的每一次使用新的分配浪费随机位 - 你也许可以最终用更少的调用引擎比,如果你不停地围绕着分配的对象.但我怀疑这很重要,特别是因为MT很快.