顯著小數生成[0,1.0]C/C++如何減少的可變
i = (float) rand()/RAND_MAX/1;
我不只是要打印一個小數點之間的隨機數的浮動的號碼,我希望變量有一個小數點 我們該怎麼做?
(即0.1;未0.1224828)
顯著小數生成[0,1.0]C/C++如何減少的可變
i = (float) rand()/RAND_MAX/1;
我不只是要打印一個小數點之間的隨機數的浮動的號碼,我希望變量有一個小數點 我們該怎麼做?
(即0.1;未0.1224828)
你真正描述是在可能的數值範圍的隨機整數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
具有較差的隨機性。我更新了答案,以避免使用它。
嘗試:
i = ((float)(rand()%11)) /10;
這不會編譯,因爲'%'不接受'float'操作數。另外,'%'是一種很差的方式來分配來自'rand'的值,因爲它在間隔的低端聚集了額外的值(由於RAND_MAX + 1不是模數的倍數)。 –
@EricPostpischil固定括號,但什麼是更好的方式來獲得在固定範圍內的分佈? – Alex
如果您的應用程序可以使用稍微不均勻的分佈,那麼您可以在[另一個答案](http://stackoverflow.com/a/15684059/298225)中使用這樣的代碼,間隔,儘管在某些情況下浮點舍入可能是一個問題。如果您的應用程序需要完全一致的分佈,那麼必須拒絕超出的值並選擇一個新的隨機值(因此可以運行一個循環直到獲得滿意的結果)。 –
當存儲在一個浮點變量的值「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
更好;另外,其教訓適用於其他情況。
你發佈了很好的鏈接,現在我明白了我的代碼不好 –
@GrijeshChauhan:如果你必須用C編寫很多代碼,請每個月從前到後閱讀該FAQ。 –
不錯!本書明顯感謝:) –
盡你所能努力。變量總是會有不止一個。 – chris
乘以十,地板除以十? –
@chris男孩你是錯的 – Iancovici