0
main()
{
     int i;
     srand((int)time(NULL));
     for(i = 0; i < 10; i++)
     printf("%f\n", randomInRange(0, 100));   // %f instead of %d
}

int randomInRange(int lo, int hi)
{

     double d = (double)rand() / ((double)RAND_MAX + 1);
     int k = (int)(d * (hi - lo + 1));
     return k+lo;
}

使用 %d 打印值时,效果很好
,但是如果我选择 %f 而不是 %d,它只会生成 0
为什么?

4

3 回答 3

3

n1570.pdf(C 标准)的第 7.21.6.1p9 节说,关于 printf:

...如果任何参数不是相应转换规范的正确类型,则行为未定义。

第 7.21.6.1p8 节说明了%f格式说明符的正确类型:

f,Fdouble表示浮点数的参数以 [−]ddd.ddd 样式转换为十进制表示法,其中小数点字符后的位数等于精度规范。

randomInRange返回一个整数。int 显然不是 double,因此行为是未定义的。一只鸡可能会跑来跑去,尽管它的头不见了……那只鸡可能会也可能不会导致某人摔倒并摔断脖子。避免无头鸡和未定义的行为。

在以后提出问题之前,请查阅手册并尝试自己找到答案。通过这样做,您将有助于减少 Internet 上此类信息的冗余。

于 2013-03-08T09:20:05.863 回答
2

原因是解释为浮点数的小整数 (< 2^23)非常小。

s eeeeeee emmmmmmm mmmmmmmm mmmmmmmm  == sign * 1.mmmmmm * 2^(eeeee - 128)
0 0000000 00000000 00000000 11111111  == 255 as integer

这个 32 位整数拆分为位并解释为浮点数约为 255 * 2^-128,或约 3.57e-43,正确显示为 0.0。

您也可以尝试将其打印为“%e”,显示科学表示,或“%g”,显示“最小准确”表示。

于 2013-03-08T09:30:40.333 回答
0

我知道一种在c中随机化数字的简单而好方法

 #include<stdlib.h>
#include <time.h>

srand(time(NULL));

int  r = rand()%100; 

只需将其写在c中,随机数将放入“r”

于 2013-03-08T12:20:33.660 回答