为什么随机生成器只生成零

时间:2013-03-08 09:07:08

标签: c

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 为什么?

3 个答案:

答案 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”