2013-03-08 58 views
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; 
} 

,它工作得很好
但如果我选择%f,而不是%d,它产生0只
为什么呢?为什么随机数生成器仅使用%d打印值时产生零

+4

一个'float'不一个'int'不是'float' ... – 2013-03-08 09:08:44

+1

因为'printf'不能转换吗?尝试'printf(“%f \ n”,(float)randomInRange(0,100));' – Pubby 2013-03-08 09:09:06

+1

如果编译器支持,我建议你使用'-Wformat'。 – Will 2013-03-08 09:11:10

回答

3

科n1570.pdf的7.21.6.1p9(C标准)表示,相对于printf的:

...如果任何参数是不正确的类型为对应 转换说明书中,行为未定义。

节7.21.6.1p8状态的正确类型的%f格式说明:

F,F表示浮点数甲double参数 转换为十进制表示法中的样式[ - ] ddd.ddd,其中 小数点后的数字位数等于 精度规格。

randomInRange返回int。一个int显然不是double,所以行为是不确定的。尽管它的头部正在失踪,鸡可能会跑来跑去......这只鸡可能会或可能不会导致某人倒下并摔断脖子。避免无头鸡和不确定的行为。

请参考手册,并尝试自己找答案,然后再问问题。通过这样做,您将有助于减少互联网上这些信息的冗余。

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”。

+0

所以你的意思是结果不是“undefined”@formifiable lvalue说的?它太小而不能被解释......对吗? – Bin 2013-03-08 10:31:53

+0

即使是未定义的行为,通常也是一些东西。将说明符更改为“%g”输出6。95316e-310,它实际上是双重型,但我认为这一点已被证实。 – 2013-03-08 10:45:33

0

我知道一个很容易和好方法随机在C号

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

srand(time(NULL)); 

int r = rand()%100; 

只是写在C和随机数将被放置在“R”