【问题标题】:rand() not generating random numbers even after srand(time(NULL))rand() 即使在 srand(time(NULL)) 之后也不生成随机数
【发布时间】:2020-07-13 22:01:38
【问题描述】:

我正在尝试使用循环调用类函数

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()。 此外,还包括头文件和。 怎么回事?

【问题讨论】:

  • 在循环中使用srand() 可能不好,在这种情况下它错误的。
  • 虽然这里并不关键,但值得注意的是 rand() 并不是一个特别好的伪随机数生成器。看看 std::mt19937 之类的东西

标签: c++


【解决方案1】:

您必须调用一次srand(),而每次进入generateWeight() 时都调用它。由于现在的计算机速度很快,time() 以秒为单位返回时间,这主要是从同一个种子重新启动随机数生成器。

【讨论】:

    【解决方案2】:

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

    一般来说,1) 不要在循环中使用 srand() 并且 2) rand() 有几个缺陷,因为它不能生成分布良好的随机数(关于这个 rand() considered harmful 的精彩视频)

    您应该使用 std::uniform_int_distribution(需要 C++11)而不是 rand():

    #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';
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-30
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多