C++問題記錄

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函數上層是否存在循環。

最後, 覺得文章對你有用的話,右側邊欄點個打賞吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章