2011-10-25 69 views
10

只是想知道,如果我有以下代碼:隨機數從-9至9日在C++

int randomNum = rand() % 18 + (-9); 

這將創建一個隨機數從-9到9?

+0

相關:http://stackoverflow.com/questions/686353/c-random-float/686373#686373 –

回答

25

不,它不會。您正在尋找:

int randomNum = rand() % 19 + (-9); 

有-9和+9之間的19個不同整數(包括),但rand() % 18只給出了18點的可能性。這就是爲什麼你需要使用rand() % 19

+0

爲什麼19而不是18? :S confused lol – Danny

+0

@丹尼:看到擴展的答案。它基於假定你希望-9和+9都是該範圍的一部分。如果你不這樣做,請澄清你的要求。 – NPE

+0

@Danny:因爲'rand()%19'總是小於19,所以最大值可以是18並且18-9是9. –

7

您的代碼返回(0-9和17-9)=(-9和8)之間的數字。

爲了您的信息

rand() % N; 

0和回報之間的數N-1 :)

正確的代碼是

rand() % 19 + (-9); 
2

你是正確的,有18張數計數-9和9(含)。

但計算機使用整數(Z集),其中包括零,這使得它的19個數字。

您從rand()通過RAND_MAX獲得的最小比例爲0,因此您需要減去9才能得到-9。

此外,manpage for the rand function報價:

「如果你想生成1到10之間的任意整數,你總是應該通過使用高序位做到這一點,因爲在

j = 1 + (int) (10.0 * (rand()/(RAND_MAX + 1.0))); 

也不會被任何類似

j = 1 + (rand() % 10); 

(它使用較低位)。「

所以你的情況,這將是:

int n= -9+ int((2* 9+ 1)* 1.* rand()/ (RAND_MAX+ 1.)); 
+0

關於生成有趣的事實隨機數與'rand()' – Shahbaz

+0

其實,[其他來源](http://linux.die.net/man/3/rand)引用這個問題或多或少是歷史性的。但rand()函數和其他數學運算還存在其他問題,例如13個numbres會產生6個其他數字。如果可能,請使用C++ 11中的新隨機生成器函數(或提升備選方案) – KillianDS

+0

值得注意,直到從聯機幫助頁中刪除。 – nurettin

5

不要忘記新C++11 pseudo-random functionality,如果你的編譯器已經支持它可能是一個選項。

僞代碼:你有疑問

std::mt19937 gen(someSeed); 
std::uniform_int_distribution<int> dis(-9, 9); 
int myNumber = dis(gen) 
0

任何時候,你可以運行一個循環,獲取億張的隨機數與原算法,得到最低值和最高值,看看會發生什麼。

+0

這是如此有限的調試。如果他的代碼以某種方式產生2的步驟,max和min可能是正確的,但分配不會......。其實這隻有在你繪製某種直方圖時纔有意義 – KillianDS

+0

你在說什麼?他的代碼是'rand()%18 +(-9)'它如何產生2的階?他不確定邊界而不是分佈。 – Petruza

+1

我在說使用你的測試,它大約爲0.這個問題不是關於邊界,而是關於「-9到9之間的隨機數」,所以我猜測他不會滿足於缺少0例如。 – KillianDS