2013-03-28 49 views
1

顯著小數生成[0,1.0]C/C++如何減少的可變

i = (float) rand()/RAND_MAX/1; 

我不只是要打印一個小數點之間的隨機數的浮動的號碼,我希望變量有一個小數點 我們該怎麼做?

(即0.1;未0.1224828)

+0

盡你所能努力。變量總是會有不止一個。 – chris

+0

乘以十,地板除以十? –

+0

@chris男孩你是錯的 – Iancovici

回答

6

你真正描述是在可能的數值範圍的隨機整數0分至10所以你可以這樣寫:

int i = rand()/(RAND_MAX/11 + 1); 

或確實一些其他的方式以產生一個整數i使得0 < =我現在< = 10

i是由10

縮放的值

如果再要了10分,做到這一點:

float f = i/10.0; 

請注意,一個二進制浮點變量不能完全代表0.1,0.2,0.3,0.4,0.6,0.7,0.8和0.9。列表中唯一可以精確表達的值是0.0,0.5和1.0。這就是爲什麼將信息存儲在整數變量中更好。

注意:正如其他人指出的(謝謝),明顯的rand() % 11具有較差的隨機性。我更新了答案,以避免使用它。

+0

你可能會發現[本頁](http://www.azillionmonkeys.com/qed/random.html)是一個有趣的閱讀。 – Sebivor

+0

@modifiablelvalue,太糟糕了,沒有提及''(是的,我知道它比C++ 11還早)。 – chris

0

嘗試:

i = ((float)(rand()%11)) /10; 
+0

這不會編譯,因爲'%'不接受'float'操作數。另外,'%'是一種很差的方式來分配來自'rand'的值,因爲它在間隔的低端聚集了額外的值(由於RAND_MAX + 1不是模數的倍數)。 –

+0

@EricPostpischil固定括號,但什麼是更好的方式來獲得在固定範圍內的分佈? – Alex

+0

如果您的應用程序可以使用稍微不均勻的分佈,那麼您可以在[另一個答案](http://stackoverflow.com/a/15684059/298225)中使用這樣的代碼,間隔,儘管在某些情況下浮點舍入可能是一個問題。如果您的應用程序需要完全一致的分佈,那麼必須拒絕超出的值並選擇一個新的隨機值(因此可以運行一個循環直到獲得滿意的結果)。 –

3

當存儲在一個浮點變量的值「R」,你不經常去商店「R」。相反,您必須將最接近的合法浮點值存儲爲'R'。 comp.lang.c FAQ

即使你不是想的範圍內產生隨機整數,你應該閱讀How can I get random integers in a certain range?這種表達

(int)((double)rand()/((double)RAND_MAX + 1) * N) 

比明顯rand() % N更好;另外,其教訓適用於其他情況。

+0

你發佈了很好的鏈接,現在我明白了我的代碼不好 –

+1

@GrijeshChauhan:如果你必須用C編寫很多代碼,請每個月從前到後閱讀該FAQ。 –

+0

不錯!本書明顯感謝:) –