如何从C ++中的区间[0,1]获得均匀分布的随机数?

时间:2015-04-01 07:10:12

标签: c++

如何从区间[0,1]中获得均匀分布的随机数?

我目前正在使用以下代码,但它在C中,我想知道如何用C ++做事。

double RND()
{
    return ((double)rand()/RAND_MAX);
}

2 个答案:

答案 0 :(得分:4)

这样做实际上有点棘手。对于整数,均匀分布类产生[min ... max]范围内的数字,但对于实数,范围是[min ... max]。要获得[0 .. 1.0],我们需要在范围的上端添加一个小数字。碰巧,由于我们的数字是1.0,标准库为我们提供了正确的数字,作为目标类型的epsilon()添加:

std::mt19937_64 gen{ std::random_device()() };
std::uniform_real_distribution<double> dis{
    0.0,
    1.0 + std::numeric_limits<double>::epsilon()
};

epsilon是可以添加到1.0并生成比较大于1.0的结果的最小数字,因此这允许数字最多(和包括)1.0,但更大 - 准确地说是要求的范围。

答案 1 :(得分:2)

您可以使用C ++ 11中添加的<random>库。有关分布和不同RNG的更多信息,请参阅cplusplus.com

std::default_random_engine generator;
std::uniform_real_distribution<double> distribution(0.0,1.0);
double number = distribution(generator);

编辑:正如长颈鹿船长所指出的,上面的代码将是[0,1]范围,而不是[0,1]。使用T.C.建议的std::uniform_real_distribution<double> distribution(0.0,std::nextafter(1.0, 2.0));获得一个封闭的上限。