随机数始终生成1个数字

时间:2010-10-05 18:33:36

标签: c++ random

//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,绝不是其他任何东西。

7 个答案:

答案 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循环的一侧