rand()即使在srand之后也不生成随机数(time(NULL))

时间:2016-06-15 15:53:11

标签: c++

我正在尝试使用循环

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

这是Fruit类的成员函数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()。 此外,头文件和包括在内。 发生了什么事?

2 个答案:

答案 0 :(得分:5)

您必须拨打srand()一次,而在每次进入generateWeight()时都会调用它。由于现在计算机很快并且time()以秒为单位返回时间,这大多会从同一种子重新启动随机数生成器。

答案 1 :(得分:0)

问题是你使用相同的种子一次又一次地初始化伪随机数生成器种子(自上次调用以来没有改变的时间,因为今天CPU非常快),因此,你总是得到相同的“随机“数字。

Generelly,1)不要在循环中使用srand()和2)rand()有几个缺陷,因为它不会生成分布良好的随机数(关于这个rand() considered harmful的好视频)

而不是rand(),你应该使用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';
}