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 + 1
performance出未定义的(溢出)行为,并成为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)不是一个好办法:
- 可以生成的不同随机数的数量太小:32768。如果你需要更多不同的随机数,你需要一个不同的方法(代码示例如下)
- 生成的数字太粗糙:你可以得到1/32768,2/32768,3/32768,但从来没有任何东西。
- 随机数发生器引擎的有限状态:在生成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); }