当RAND_MAX的值似乎为double a,b
时,为什么以下c代码对于0.000000
只能产生介于0和1之间的实数(例如:0.840188,0.394383 ... etc)。 RAND_MAX
是否应该为rand()
函数生成的数字设置最大值?
#include <stdio.h>
#include <stdlib.h>
int main()
{
double a,b,c;
for (int i=0;i<100;i++){
a=(double)rand()/(double)RAND_MAX;
b=(double)rand()/(double)RAND_MAX;
c=a-b;
printf("itteration : %d values a=%f,b=%f,c=%f, RAND_MAX=%f \n",i,a,b,c,RAND_MAX);
}
return 0;
}
答案 0 :(得分:5)
RAND_MAX
是一个整数常量,但是您正在使用%f
说明符(用于double
)打印它,这是未定义的行为(在您的情况下恰好打印0) 。使用%d
,您将看到RAND_MAX
的实际值。
顺便说一句,如果您将警告提高得足够高,几乎所有不错的编译器都会警告您有关无效的printf
。确保这样做,C和C ++充满了陷阱,至少让编译器在可能的情况下为您提供帮助。
答案 1 :(得分:1)
... RAND_MAX的值似乎是0.000000。
您正在使用说明符将整数打印为双精度。这是未定义的行为。
根据C99标准(N1256)。
7.19.6.3 printf功能
...
2. printf函数等效于fprintf ,其中插入了stdout参数 在printf的参数之前。7.19.6.1 fprintf函数
....
9.如果转换规范无效,则行为未定义。 如果有任何论点 不是对应转换规范的正确类型,其行为是 未定义。
因此它为0.000
打印RAND_MAX
。您的另一个问题:
RAND_MAX是否应为rand()函数生成的数字设置最大值?
rand()
返回0
至RAND_MAX
范围内的伪随机数。
RAND_MAX
是一个常量,其默认值可能在实现之间有所不同,但被授予至少为32767
的值。
但是rand()
与RAND_MAX
的浮点除法将产生介于0
和1
之间的值。