uniform_real_distribution让我的值超出范围

时间:2014-09-30 05:56:26

标签: c++ visual-studio-2012 c++11

我正在运行以下函数,它使用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),我并没有真正看到我做错了什么。

1 个答案:

答案 0 :(得分:1)

您定义分发:

static std::uniform_real_distribution<double> distribution(low, high);

请注意static。这意味着distribution会在GetRandomDoubleBetween()的第一次调用中构建low并传递high。下次GetRandomDoubleBetween() distribution再次构建

如果您使用不同参数拨打GetRandomDoubleBetween(),则第二次通话将使用第一次通话中的lowhigh。如果您想支持不同的参数,请删除static

另请注意,您的设计不是线程安全的。