2010-10-05 106 views
1
//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的随机数,它取决于该随机数如何证明发生在食品[]中的随机数,并把它添加到 的载体。随机数总是产生1数个

我的问题是,它似乎总是产生一个奇数或偶数。 bad和good.size()总是以6或0打印出来,而不是其他任何东西。

+4

不要在随机数发生器中使用模运算符;它使用最低有效位(几乎是确定性的)而不是前导位(更接近于伪随机)。将其除以6并截断为整数。 – 2010-10-05 18:36:57

+8

我无法抗拒:http://xkcd.com/221/ – 2010-10-05 18:39:27

+0

哦,天哪。我笑了。 – 2010-10-05 18:40:16

回答

10

在循环开始时调用srand(time(0));将每次通过循环重置随机数生成器。因此,每次你都会得到相同的初始随机数。

(从技术上讲,time(0)可能会在for循环的迭代之间返回一个不同的值,但考虑到今天处理器的速度,当您为所提供的代码发生这种情况时,这将是非常罕见的情况。)

在任何情况下,你应该(在你的程序的main程序的开始,或者更好的是,只有一次。)调用srand之前for

4

把srand()函数您for循环外。你总是重新初始化你的随机种子。

1

每个线程只能调用srand(time(0))一次。它不应该像循环中那样被多次调用。

2

srand()移到循环的外部。

你的循环可能采取低于第二各一次,所以time(0)总是返回相同的值(其分辨率为一秒),所以srand(time(0))总是使用相同的种子播种随机数生成器,所以rand()是始终使用相同的序列,因此每次在循环中都会得到相同的随机数。

1

我认为这是因为您为每次循环迭代重新播种随机数生成器。 Move for srand(time(0)); out for for循环

3

问题在于您在每个循环的开始播种您的随机数生成器。由于循环运行速度如此之快,因此每次迭代都会播种相同的时间值,因此在调用rand时会生成相同的随机数。

此外,不要使用随机数发生器使用模运算符;它使用最低有效位(几乎是确定性的)而不是前导位(更接近于伪随机)。将其除以6并截断为整数。

最后,我建议你用

else 
+0

评论得到了我注意到的所有三件事。我会亲自做一个案例0; 2; 4 ...打破;默认情况下,但任何删除不需要的绒毛。 – WernerCD 2010-10-08 13:20:02

2

您需要将呼叫转移到srandfor以上循环替换多余

else if(randomFood == 0 || randomFood == 2 || randomFood == 4) 

。此循环执行得非常快(很有可能),所以time每次都返回相同的值,因此您将重新生成具有相同值的随机数生成器,这将生成相同的伪随机数列表。您只是一次又一次地使用同一个列表的第一个成员,直到电脑的时钟进入下一秒。