rand()在0和1之间

所以下面的代码使0 <r <1

r = ((double) rand() / (RAND_MAX)) 

为什么r = ((double) rand() / (RAND_MAX + 1))使-1 <r <0?

不应该增加一个RAND_MAX使1 <r <2?

编辑:我得到一个警告:expression式中的整数溢出

在那一行,这可能是问题所在。 我只是做了一个cout << r << endl ,它肯定给了我-1到0之间的值

这完全是特定实现的 ,但是看起来在您所工作的C ++环境中, RAND_MAX等于INT_MAX

因此, RAND_MAX + 1performance出未定义的(溢出)行为,并成为INT_MIN 。 虽然你的初始语句是分割(在0和INT_MAX之间的随机INT_MAX )/( INT_MAX ),并产生一个值0 <= r < 1 ,现在它正在分割(0和INT_MAX之间的随机INT_MAX )/( INT_MIN ),产生一个值-1 < r <= 0

为了产生一个随机数1 <= r < 2 ,你会想

 r = ((double) rand() / (RAND_MAX)) + 1 

不,因为RAND_MAX通常扩展为MAX_INT。 所以加一个(显然)把它放在MIN_INT(虽然它应该是未定义的行为,因为我被告知),因此符号的反转。

为了得到你想要的东西,你需要在计算之外移动+1:

 r = ((double) rand() / (RAND_MAX)) + 1; 

rand() / double(RAND_MAX)生成一个介于0(含1)和1( 1)之间的浮点随机数,但由于以下原因(因为RAND_MAX通常为32767)不是一个好办法:

  1. 可以生成的不同随机数的数量太小:32768。如果你需要更多不同的随机数,你需要一个不同的方法(代码示例如下)
  2. 生成的数字太粗糙:你可以得到1/32768,2/32768,3/32768,但从来没有任何东西。
  3. 随机数发生器引擎的有限状态:在生成RAND_MAX随机数之后,实现通常开始重复相同的随机数序列。

由于rand()的上述限制,在0(含)和1( 不含 )之间生成随机数的更好select是以下片段(类似于http://en.cppreference.com/w中的示例/ cpp / numeric / random / uniform_real_distribution ):

 #include <iostream> #include <random> #include <chrono> int main() { std::mt19937_64 rng; // initialize the random number generator with time-dependent seed uint64_t timeSeed = std::chrono::high_resolution_clock::now().time_since_epoch().count(); std::seed_seq ss{uint32_t(timeSeed & 0xffffffff), uint32_t(timeSeed>>32)}; rng.seed(ss); // initialize a uniform distribution between 0 and 1 std::uniform_real_distribution<double> unif(0, 1); // ready to generate random numbers const int nSimulations = 10; for (int i = 0; i < nSimulations; i++) { double currentRandomNumber = unif(rng); std::cout << currentRandomNumber << std::endl; } return 0; } 

通过用unif(0, 1)replaceunif(0, 1)可以轻松修改以生成1(含)和2( unif(0, 1) )之间的随机数。

它不。 它使得0 <= r < 1 ,但是你的原始数据是0 <= r <= 1

请注意,如果RAND_MAX + 1溢出,可能会导致未定义的行为

我的猜测是, RAND_MAX等于INT_MAX ,所以你溢出它的负面。

只要这样做:

 r = ((double) rand() / (RAND_MAX)) + 1; 

或者甚至更好,使用C ++ 11的随机数生成器。

这是正确的方法:

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

要么

 double randd() { return (double)rand() / (RAND_MAX + 1.0); }