我正在尝试使用循环
调用类函数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()。 此外,头文件和包括在内。 发生了什么事?
答案 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';
}