2016-06-15 24 views
-2

我試圖使用循環蘭特()不產生隨機數(時間(NULL))

for (int i = 0; i < Basket.getLemonNum(); i++) 
{ 
    lemonWeights[i] = Fruit.generateWeight(fruit, fruitWeight); 
    cout << lemonWeights[i] << " "; 
} 

這正好水果類,它的成員函數generateWeight(調用類函數):

int fruitClass::generateWeight(char fruitN, int& fruitW) 
    { 
    srand(time(NULL)); 

    int weight = 0; 

    switch (fruitName) 
    { 
    case 'a': 
     weight = rand() % 500 + 100; 
     return fruitW = weight; 
     break; 
    case 'l': 
     weight = rand() % 400 + 300; 
     return fruitW = weight; 
     break; 
    case 'w': 
     weight = rand() % 1000 + 800; 
     return fruitW = weight; 
     break; 
    } 
} 



Output: 
128 128 128 128 

但它產生相同數量的時候,甚至當我使用不同的函數來調用它:

for (int i = 0; i < Basket.getWatermelonNum(); i++) 
{ 
    watermelonWeights[i] = Fruit.generateWeight(fruit, fruitWeight); 
    cout << watermelonWeights[i] << " "; 

} 

Output: 
128 128 128 

正如你所看到的,我做了種子srand()。 此外,頭文件和包括在內。 發生了什麼事?

+1

[見本](http://stackoverflow.com/questions/7343833/srand-why-call-it-only-once) – Rakete1111

+0

在循環中使用'srand()'可能不太好,在這種情況下* *是錯誤的。 – MikeCAT

+2

儘管在這裏並不重要,但值得注意的是rand()不是一個特別好的僞隨機數生成器。看看像std :: mt19937 –

回答

5

必須調用srand()一次,而你怎麼稱呼它在每一個進入generateWeight()。由於現在的計算機速度很快,並且time()以秒爲單位返回時間,這通常會重新啓動來自相同種子的隨機數生成器。

+0

謝謝!我通過從循環中刪除它來解決它 – chuakc92

0

的問題是,你使用相同的種子(其自上次調用並沒有改變,因爲現在的CPU是非常快的時間),因此,你總是得到相同的連連初始化僞隨機數發生器種子「隨機」數字。

Generelly,1)不使用srand()函數在一個循環和2)蘭特()有一些缺陷,因爲它不會產生很好的分佈隨機數(不錯的視頻這個rand() considered harmful

相反蘭特()應該使用std::uniform_int_distribution(需要C++ 11):

#include <random> 
#include <iostream> 

int main() 
{ 
    std::random_device rd; 
    std::mt19937 gen(rd()); 
    std::uniform_int_distribution<> dis(1, 6); 

    for (int n=0; n<10; ++n) 
     std::cout << dis(gen) << ' '; 
    std::cout << '\n'; 
}