2013-03-08 74 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」