//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,它取食物[]中的随机数并将其添加到 一个向量取决于随机数的结果。
我的问题似乎是它总是产生奇数或偶数。而bad和good.size()总是打印为6或0,绝不是其他任何东西。
答案 0 :(得分:10)
在循环开始时调用srand(time(0));
,每次循环都会重置随机数生成器。因此,每次都会保持相同的初始随机数。
(从技术上讲,time(0)
有可能在for循环的迭代之间返回一个不同的值,但考虑到今天处理器的速度,当你提供的代码发生这种情况时,这将是一种非常罕见的情况。 。)
在任何情况下,您都应该在 srand
循环之前调用for
右(或者,更好的是,只需在程序的main
开头一次例程。)
答案 1 :(得分:4)
将srand()放在for
循环之外。你总是重新初始化随机种子。
答案 2 :(得分:3)
问题是你在每个循环开始时播种你的随机数生成器。由于循环运行得如此之快,因此每次迭代都会播放相同的时间值,因此在调用rand时会产生相同的随机数。
另外,不要使用随机数生成器的模运算符;使用最低有效位(几乎是确定性的)而不是前导位(更接近伪随机位)。除以6,然后截断为整数。
最后,我建议更换多余的
else if(randomFood == 0 || randomFood == 2 || randomFood == 4)
带
else
答案 3 :(得分:2)
将srand()
移到循环外部。
你的循环每次可能不到一秒钟,所以time(0)
总是返回相同的值(它的分辨率是一秒),所以srand(time(0))
始终为随机数生成器播种相同的种子,因此rand()
始终使用相同的序列,因此每次循环时都会获得相同的随机数。
答案 4 :(得分:2)
您需要将呼叫转移到srand
循环之上的for
。此循环执行速度非常快(很可能),因此time
每次都返回相同的值,因此您将使用相同的值重新生成随机数生成器,这将生成相同的psudo随机数列表。您只是反复使用同一列表的第一个成员,直到计算机的时钟点击到下一秒。
答案 5 :(得分:1)
每个帖子只调用srand(time(0))
一次。它不应该像你的循环一样被多次调用。
答案 6 :(得分:1)
我认为这是因为你为每个循环迭代重新播种随机数生成器。将srand(time(0));
移出for循环的一侧