我有这个代码:
static std::mt19937 rnd; // ... static uint32_t rndInt(uint32_t min,uint32_t max) { return std::uniform_int_distribution<uint32_t>(min,max)(rnd); }
这是好的做法还是应该存储uniform_int_distribution?
解决方法
我怀疑分发对象的创建和销毁是昂贵的,尽管我认为它可能稍微超过只存储参数min,max.它可以基于参数预先计算一些有用的值,例如在明显的实现中2 ** 32%(max-min 1)是将被丢弃和重新尝试的来自发生器的不同值的数量.
原则上,允许分配对象在其中存储在先前对operator()的调用中从发生器获取的一些熵,但不是必需的.这些位可以用于稍后的operator()调用.所以如果min == 0和max == 1,那么你可以在生成器上每次调用的分配上得到32次对operator()的调用.这就是reset()函数,清除这个状态.
因此,如果您重复使用相同的最小/最大值,那么在技术上,您每次都会浪费随机位数,因为每次都使用新的分发 – 如果您保留分发对象,您可能会减少对引擎的调用.但是我怀疑这件事很重要,特别是因为MT很快.