C语言中的rand()函数的有关问题
C语言中的rand()函数的问题代码如下,为什么a总是输出0,而b却能正常输出?rand()的返回值不是在0~RAND_MAX之
C语言中的rand()函数的问题
代码如下,为什么a总是输出0,而b却能正常输出?rand()的返回值不是在0~RAND_MAX之间的整数吗?
是的,这样确实可以,但是我的例子是怎么回事啊?不解。。。。
你用的什么编译器,我把你的例子拿到vs2010上编译 a b都正常显示啊,你看看你例子在我机子上跑的结果:

我用的GCC,结果就不能正确运行!
RAND_MAX本身就表示int(4个字节)能表示的最大那个数,而你10*rand必然大于RAND_MAX,也就是说超过了int的范围,所以a全部是0。第二个例子被转换成了double(8个字节),完全有能力容纳10.0*rand(),所以b结果正常。
要解决a的问题很简单,把a的类型搞大点就ok了(注:unsigned不行,10*rand()最大能比int的最大范围大10倍,而unsigned整数范围比int才大2倍,所以还是不够,我们这里用long long类型做实验),如:
#include <stdlib.h>
#include <stdio.h>
int main (void)
{
long long a;
int b;
int i;
for (i=0;i<5;i++)
{
a=10*(long long)rand()/RAND_MAX;
printf ("a=%d\n",a);
}
for (i=0;i<5;i++)
{
b=10.0*rand()/RAND_MAX;
printf ("b=%d\n",b);
}
}
gcc下运行结果:

嗯,对,但是他为什么会在VC中正常运行呢?难道VC有独特的溢出处理机制吗?
呵呵 刚开始我也很纳闷;最后我发现:在linux下RAND_MAX是2147483647 ,而在vc下RAND_MAX是32767。我想这下你应该明白了吧。