1. 2分鐘學會使用隨機數函數,避免使用誤區
產生隨機數一般把void srand (unsigned seed)和int rand(void)結合使用。
srand函數用來設置產生一系列僞隨機數發生器的起始點,而rand函數則用這個起點來產生隨機數。所以一般代碼是這樣寫的
void func() {
unsigned int seed = 0;
srand(seed);
for (int i = 0; i < 10; ++i) {
cout << rand() << endl;
}
}
種子seed做爲起點每次都是0,所以每次func方法rand函數產生的僞隨機數都是一樣的。
爲了每次僞隨機數都不同,且將隨機值限定在一定範圍我們會寫出如下代碼
void func() {
//每次執行時間不同,將時間做爲種子,可以做到每次僞隨機數產生起點不同
unsigned int seed = time(NULL);
srand(seed);
for (int i = 0; i < 5; ++i) {
//將隨機值限定在0-99範圍
cout << rand() % 100 << endl;
}
}
但是,切記一般不要把srand函數寫在循環內。有時候我們會寫下下面的代碼,fuc2函數調用func函數,運行可以發現每次產生的隨機數組都相同。
因爲程序執行很快,每次時間可以說是相同的,造成種子沒有變化,僞隨機數起點沒變。
//把設置種子寫循環內,造成了每次產生的隨機數組都相同
void func() {
srand(time(NULL));
for (int i = 0; i < 5; ++i) {
cout << rand() % 100 << " ";
}
cout << endl;
}
void func2() {
for (int i = 0; i < 10; ++i) {
func();
}
}
因此如果多個函數嵌套調用發現每次執行隨機數組沒變,可以檢查下srand函數上層是否存在循環。