2014-02-22 53 views
0

我一直在嘗試爲動態分配的實例數組生成一個隨機數,但每次嘗試時,每個實例總是會得到完全相同的值:隨機數發生器返回相同的值(C++)

//IN MAIN 
Enemy* enemy; 
int num; 
std::cout << "How many enemies would you like there to be?" << std::endl; 
std::cin >> num; 
enemy = new Enemy[num]; 

for (int q = 0; q < num; q++) 
{ 
    enemy[q].setAngle(); 
} 

for (int q = 0; q < num; q++) 
{ 
    std::cout << enemy[q].getAngle() << std::endl; 
} 

//IN THE ENEMY CLASS 
void Enemy::setAngle() 
{ 
    srand(time(NULL)); 
    angle = rand() % 360 + 1; 
} 

int Enemy::getAngle() 
{ 
    return angle; 
} 

輸出將始終爲1到360之間的數字,但當調用getAngle()時,輸出只是在多行上重複的相同數字。這是爲什麼發生?我做錯了什麼,我該如何解決?

在此先感謝

+1

嘗試在每次獲得隨機數時不重新初始化種子。如果您在少量時間內多次初始化種子,您可能會得到相同的種子,然後使用相同的數字 – Manu343726

+0

我認爲「時間」的分辨率爲1秒,所以您可能每次使用相同的值進行初始化調用該函數(參見上面的註釋)。 – kazemakase

回答

3

你播種每次調用setAngle時間的隨機數發生器。如果這一切都發生在一秒內(這是time的分辨率),它將始終以相同的值播種,因此以相同的僞隨機值開始。相反,您應該在程序開始時只撥打srand一次。

+0

哦,我的天啊!非常感謝!這個bug幾周來一直令我癢。我從來沒有聽說過srand是最好的宣佈一次。謝謝! –