2015-04-01 473 views
0

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

我目前正在使用下面的代码,但它是在C中,我想知道如何用C++代替。

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

即使人们读了很多“rand()/ RAND_MAX”,它仍然是不统一的。 – 2015-04-01 07:13:36

+0

1.什么让你觉得这不适用于C++? – 2015-04-01 07:13:45

+0

我想找到一个统一的随机。我用上面的代码来生成这个数字。但是,如果我创建一个C++函数会更好。 – Jame 2015-04-01 07:15:05

回答

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));来获得一个封闭的上限。

+0

从文档*“均匀分布在区间[ a,b),“*。即不包括b。 – 2015-04-01 07:38:55

+2

对于关闭的时间间隔,使用'std :: nextafter(1.0,2.0)'作为上限。 – 2015-04-01 07:40:27

+0

它只是[0 1)。但我需要的范围[0 1] – Jame 2015-04-01 07:47:44

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,但是更大的数字 - 恰好是请求的范围。