如果您在未先致電srand()
的情況下致電rand()
,它將會如同隱式調用srand(1)
那樣操作。標準C99 7.20.2.2 The srand function
(其上cstdlib
基於)的相關位指出:
如果蘭特被稱爲已作出函數srand任何呼叫之前,相同的序列應爲srand時先用種子稱爲生成1.
值換句話說,你將得到相同的序列中的每個時間。你可以改變你main
到:
int main (int argc, char* argv []) {
srand (time (0)); // needs ctime header.
for (int i = 0; i < 5; i++)
cout << random (2, 5) << endl;
wait();
}
來解決這個問題,假設你不運行它不止一次第二。
如上所述,您需要使用ctime
標題。你也應該拉cstdlib
因爲這是rand
和srand
住的地方。使用cXXX
標題而不是XXX.h
標題(例如cmath
而不是math.h
)通常也是一個好主意。
所以,在作出所有這些變化(與使用顯式的命名空間,這是我比較喜歡,雖然別人可能沒有),我結了:
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
void wait() {
int e;
std::cin >> e;
}
int random (int low, int high) {
if (low > high) return high;
return low + (std::rand() % (high - low + 1));
}
int main (int argc, char* argv []) {
std::srand (std::time (0));
for (int i = 0; i < 5; i++)
std::cout << random (2, 5) << '\n';
wait();
}
賦予不同的順序,每次我無論如何,運行它幾次。顯然,數據重複的時間有很長的限制(只有4種可能性),輸出的「隨機」特性意味着它可能在此之前重複:-)
Nit:數學上,這不會讓他們「更隨機」。 – 2012-02-27 10:51:11
的確如此,但是在OP的問題中......(加上引號;-) – John3136 2012-02-27 23:48:41