clarification for RAND_MAX and rand() in c stdlib.h
当RAND_MAX的值似乎是0.000000时,为什么以下c代码对于double a,b只产生介于0和1之间的实数(例如:0.840188,0.394383 ...等)。 RAND_MAX是否不应该为rand()函数生成的数字设置最大值?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #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
",i ,a ,b ,c ,RAND_MAX );
}
return 0;
} |
-
如果x在0和max之间,则x / max的结果将始终在0和1之间,即简单的数学运算。 加号RAND_MAX不是其整数的两倍,因此请使用%d通过printf打印它。 rand不适合生成双精度数,其设计是针对int数,并且它不是很"随机"。 您应该搜索在C中处理随机的库。
-
参考 还:为什么printf("%f",0); 给未定义的行为?
RAND_MAX是整数常数,但是您正在使用%f说明符(用于double)打印它,这是未定义的行为(在您的情况下,它恰好打印0)。使用%d,您将看到RAND_MAX的实际值。
顺便说一下,如果您将警告提高得足够高,几乎所有不错的编译器都会警告您该无效的printf。确保这样做,C和C ++充满了陷阱,至少让编译器在可能的情况下为您提供帮助。
-
啊,谢谢!但是快速查看源代码会显示#define RAND_MAX 2147483647,但是RAND_MAX并未定义为整数,只是没有类型的立即数。默认情况下,编译器是否采用立即数并将其分配为整数类型?
-
@TheSprintingEngineer一个#define创建一个宏,它是残酷的文本替换,因此,每当您编写RAND_MAX时,其宏就如同您编写了2147483647一样;现在,该值是一个十进制整数文字-因为它匹配相应的语法产生式,即[1-9][0-9]*。十进制整数表达式的类型是通过标准中详述的算法来决定的,该算法本质上类似于"获取已解析的数字,然后尝试将其放入int,unsigned int,long,unsigned long,long long ,unsigned long long;可以代表它的第一个是它的类型"。
-
顺便说一句,有趣的是,该标准要求RAND_MAX只是一个"常数积分表达式",它对其特定的整数类型没有任何限制,因此从理论上讲,实现可以具有#define RAND_MAX 32767ULL(那是unsigned long long文字);因此,为了获得最大的可移植性,在打印时应先将其强制转换为int,否则%d说明符可能不正确(OTOH没有强制转换溢出的风险,因为RAND_MAX是rand()的最大值>可以返回,并且它返回int,因此它一定适合)。
...the value for RAND_MAX appears to be 0.000000.
您正在使用说明符打印一个双精度整数。这是未定义的行为。
来自C99标准(N1256)。
7.19.6.3 The printf function
...
2. The printf function is equivalent to fprintf with the argument stdout interposed
before the arguments to printf.
7.19.6.1 The fprintf function
....
9. If a conversion specification is invalid, the behaviour is undefined. If any argument is
not the correct type for the corresponding conversion specification, the behavior is
undefined.
因此它为RAND_MAX打印0.000。您的其他问题:
Shouldn't RAND_MAX set the maximum value for the number generated by rand() function ?
rand()返回在0至RAND_MAX范围内的伪随机数。
RAND_MAX是一个常量,其默认值在不同的实现中可能有所不同,但至少应为32767。
但是rand()与RAND_MAX的浮点除法将产生0和1之间的值。