2010-10-05 156 views
1
//Generate Food Personality 
for(i=0; i<food.size(); i++) 
{ 
    srand(time(0));  
    int randomFood = rand() % 6; 

    if(randomFood == 1 || randomFood == 3 || randomFood == 5) 
    { 
     badFood.push_back(food[randomFood]); 
    } 
    else if(randomFood == 0 || randomFood == 2 || randomFood == 4) 
    { 
       goodFood.push_back(food[randomFood]); 
    } 
} 
cout << "Size of Food Vector: " << food.size() << endl; 
cout << "Size of Bad Food: " << badFood.size() << endl; 
cout << "Size of Good Food " << goodFood.size() << endl; 

randomFood是通過6的隨機數,它取決於該隨機數如何證明發生在食品[]中的隨機數,並把它添加到 的載體。隨機數總是產生1數個

我的問題是,它似乎總是產生一個奇數或偶數。 bad和good.size()總是以6或0打印出來,而不是其他任何東西。

+4

不要在隨機數發生器中使用模運算符;它使用最低有效位(幾乎是確定性的)而不是前導位(更接近於僞隨機)。將其除以6並截斷爲整數。 – 2010-10-05 18:36:57

+8

我無法抗拒:http://xkcd.com/221/ – 2010-10-05 18:39:27

+0

哦,天哪。我笑了。 – 2010-10-05 18:40:16

回答

10

在循環開始時調用srand(time(0));將每次通過循環重置隨機數生成器。因此,每次你都會得到相同的初始隨機數。

(從技術上講,time(0)可能會在for循環的迭代之間返回一個不同的值,但考慮到今天處理器的速度,當您爲所提供的代碼發生這種情況時,這將是非常罕見的情況。)

在任何情況下,你應該(在你的程序的main程序的開始,或者更好的是,只有一次。)調用srand之前for

4

把srand()函數您for循環外。你總是重新初始化你的隨機種子。

1

每個線程只能調用srand(time(0))一次。它不應該像循環中那樣被多次調用。

2

srand()移到循環的外部。

你的循環可能採取低於第二各一次,所以time(0)總是返回相同的值(其分辨率爲一秒),所以srand(time(0))總是使用相同的種子播種隨機數生成器,所以rand()是始終使用相同的序列,因此每次在循環中都會得到相同的隨機數。

1

我認爲這是因爲您爲每次循環迭代重新播種隨機數生成器。 Move for srand(time(0)); out for for循環

3

問題在於您在每個循環的開始播種您的隨機數生成器。由於循環運行速度如此之快,因此每次迭代都會播種相同的時間值,因此在調用rand時會生成相同的隨機數。

此外,不要使用隨機數發生器使用模運算符;它使用最低有效位(幾乎是確定性的)而不是前導位(更接近於僞隨機)。將其除以6並截斷爲整數。

最後,我建議你用

else 
+0

評論得到了我注意到的所有三件事。我會親自做一個案例0; 2; 4 ...打破;默認情況下,但任何刪除不需要的絨毛。 – WernerCD 2010-10-08 13:20:02

2

您需要將呼叫轉移到srandfor以上循環替換多餘

else if(randomFood == 0 || randomFood == 2 || randomFood == 4) 

。此循環執行得非常快(很有可能),所以time每次都返回相同的值,因此您將重新生成具有相同值的隨機數生成器,這將生成相同的僞隨機數列表。您只是一次又一次地使用同一個列表的第一個成員,直到電腦的時鐘進入下一秒。