2013-04-06 61 views
-2

我試圖生成蘭特隨機數如下:幫助我建立這個隨機數

return a + (rand() % n); 

其中a是漂移值(即連續整數的所需範圍的第一個數字)並且n是比例因子(即,連續整數的期望範圍的寬度)。

- Ç如何第六版計劃 - Deitel公司

我把它寫成:

return 1 + (rand() % 1000); 

和它的作品,但是當我寫的代碼如下:

return 1000 + (rand() % 1112); 

我最終得到了荒謬的大數字,例如1756和1877.那是發生的最後兩個輸出。

我返回值作爲一個整數的printf語句中的函數調用,但我做同樣與工作發言,所以我不認爲這我調用函數的方式。

我在做什麼錯了......?

+0

使用'蘭特()%x'幾乎總是略微向範圍中的較低的數字偏壓(因爲如果'(RAND_MAX + 1)'是不x'的'的精確倍數,有更多的值,其中'蘭特()%x == 0'比'rand()%x == x - 1')。爲了保持一致性,你應該丟棄rand()大於或等於((RAND_MAX + 1)/ x)* x'的任何值,每次從rand()獲得一個新值大。如果你不關心不一致性,這種改進是不必要的;只要知道你正在做的近似。 – 2013-04-06 01:04:14

+0

@JonathanLeffler更妙的是,根本就沒有使用'rand'和用戶一個適當的PRNG) – 2013-04-06 01:54:55

回答

5

你沒有做錯什麼。你的期望是什麼錯誤。

一個是,它可以產生最低的可能數目,但它可以產生最高的不是n ... n是範圍的大小,因此它可以產生最高的數字是A + N。不僅要複製算法和代碼,而且要理解它的工作原理非常重要。讓我們來看看:

return 1000 + (rand() % 1112); 

rand()的範圍是什麼?任何介於0和RAND_MAX之間的數字(這是一個非常大的數字)

(rand()%1112)的範圍是什麼?首先,查找模運算。 1112?它可以是0(例如0/1112),也可以高達1111 1111/1112剩餘的1111),但在此之後它將循環返回(1112/1112的餘數爲0,1113/1112的餘數爲1,等等)。

現在,什麼是1000〜+(任何數量的從0到1111)?

+0

我得到這個與工作'1000 +(蘭特()%112);'但我不明白我從來沒有得到一個數字如果我使用'1 +(rand()%6),則爲7;',謝謝你的幫助。 – chrstphrmllr 2013-04-06 01:22:18

+1

呃......'(rand()%6)'會給你一個介於0和5之間的數字。由於'1 + 0 = 1'和'1 + 5 = 6'當然你永遠不會得到7 '1 +(rand()%6)' - 如果你這樣做的話,會有*錯誤。你知道** modulo **操作的含義嗎?如果沒有,你可能想開始[這裏](http://en.wikipedia.org/wiki/Modulo_operation)。 – 2013-04-06 01:52:50