我正在运行以下函数,它使用Visual Studio 2012给出了我在[低,高]范围之外的值(我得到的随机数结果高于我给出的最高值 - 例如1.8848149390180773,范围为[0.0,1.0)):
double GetRandomDoubleBetween(double low, double high)
{
assert(low <= high);
static std::random_device rd;
static std::mt19937 rng(rd());
static std::uniform_real_distribution<double> distribution(low, high);
double random = distribution(rng);
assert(random >= low);
assert(random < high);
return random;
}
我已经看过这个文档链接(http://en.cppreference.com/w/cpp/numeric/random/uniform_real_distribution)和这个问题(out of range random number generation in C++ using tr1),我并没有真正看到我做错了什么。
答案 0 :(得分:1)
您定义分发:
static std::uniform_real_distribution<double> distribution(low, high);
请注意static
。这意味着distribution
会在GetRandomDoubleBetween()
的第一次调用中构建low
并传递high
。下次GetRandomDoubleBetween()
distribution
再次构建
如果您使用不同参数拨打GetRandomDoubleBetween()
,则第二次通话将使用第一次通话中的low
和high
。如果您想支持不同的参数,请删除static
。
另请注意,您的设计不是线程安全的。