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 为什么?
答案 0 :(得分:3)
n1570.pdf的第7.21.6.1p9节(C标准)说,关于printf:
...如果任何参数不是相应的正确类型 转换规范,行为未定义。
第7.21.6.1p8节规定了%f
格式说明符的正确类型:
f,F 表示浮点数的
double
参数是 转换为样式[ - ] ddd.ddd中的十进制表示法,其中 小数点字符后的位数等于 精度规格。
randomInRange
返回一个int。 int显然不是double,因此行为未定义。一只鸡可能会跑来跳去,尽管头部缺失了......那只鸡可能会也可能不会导致某人摔倒并摔断脖子。避免无头鸡和未定义的行为。
在将来提问之前,请先查阅手册并尝试自己寻找答案。通过这样做,您将有助于减少互联网上此信息的冗余。
答案 1 :(得分:2)
原因是小整数(&lt; 2 ^ 23)被解释为浮点数真的小。
s eeeeeee emmmmmmm mmmmmmmm mmmmmmmm == sign * 1.mmmmmm * 2^(eeeee - 128)
0 0000000 00000000 00000000 11111111 == 255 as integer
这个32位整数分割成位并解释为float大约是255 * 2 ^ -128,或大约3.57e-43,正确显示为0.0。
您也可以尝试将其打印为显示科学表示的“%e”,或显示“最小准确”表示的“%g”。
答案 2 :(得分:0)
我知道一种在c
中随机化数字的简单方法 #include<stdlib.h>
#include <time.h>
srand(time(NULL));
int r = rand()%100;
只需在c中写这个,随机数将放在“r”
中