【发布时间】:2015-08-29 13:06:18
【问题描述】:
我观察到rand() 库函数在循环中仅被调用一次时,几乎总是产生正数。
for (i = 0; i < 100; i++) {
printf("%d\n", rand());
}
但是当我添加两个rand() 调用时,生成的数字现在有更多的负数。
for (i = 0; i < 100; i++) {
printf("%d = %d\n", rand(), (rand() + rand()));
}
谁能解释为什么我在第二种情况下看到负数?
PS:我在循环之前将种子初始化为srand(time(NULL))。
【问题讨论】:
-
rand()不能为负数... -
rand() + rand() 可以溢出
-
您的编译器的
RAND_MAX是什么?您通常可以在stdlib.h中找到它。 (搞笑:查看man 3 rand,上面有一行描述“坏随机数生成器”。) -
做每个理智的程序员都会做的事情
abs(rand()+rand())。我宁愿有一个积极的UB而不是消极的! ;) -
@hexa:这对 UB 来说不是解决方案,因为添加已经发生。你不能让 UB 成为定义的行为。一个理智的程序员会像地狱一样避免UB。