【发布时间】:2014-01-16 15:30:49
【问题描述】:
我正在重写这个函数:
long rng(long low, long high)
{
return low + long((high - low + 1) * double(rand() / double(RAND_MAX + 1.0)));
}
将其更新为 C++11 和 Mersenne Twister。
long rng(long low, long high)
{
static std::mt19937 rnumber; // Mersenne Twister
std::uniform_int_distribution<unsigned> u (low, high);
return u(rnumber);
}
现在这似乎可行,但我的 C++11 书指出,在类似情况下,引擎和分发器都应该是“静态的”。问题是我想调用具有不同范围的函数,如果我将分配器设为静态,那么范围总是相同的。
那么应该如何正确处理呢?
另外两个问题:
为什么 Stroustrup 的书似乎建议我应该使用 {low, high} 而不是 (low, high)?有什么区别?
-
在 gcc 4.8.1 和没有优化的情况下,rand 的速度可能是 Mersenne 的两倍,而使用 -O3 rand 具有相同的性能,而 Mersenne 实际上甚至比 rand 更快?
【问题讨论】:
-
{}是“统一初始化”,Stroustrup 建议这样做,因为在任何地方使用它都会减少混乱。 -
@OliCharlesworth 我猜他知道引擎必须是静态的。他想知道为什么分布也应该如此。因为在他的情况下它不能。
-
我认为你真正的问题是没有种子。
-
另外,请使用
<long>进行分发。它应该命名要返回的类型;在你的情况下long,而不是unsigned。