2016-07-30 115 views
1

我有奇怪的行为,其中我尝试生成随机数 ,他们有时完全相同, 或有问题,如果他们在同一时间创建? 使用VC 2012C随机数发生器有时产生相同的数字

for (int i = array_size; i < (array_size); i++) 
{ 

     srand((unsigned int)time(NULL)); 
     int rw = rand() % 960 + (20); //returns a pseudo-random integer between x resolution size 0 -> width 
     int rh = rand() % 640 + (20); //returns a pseudo-random integer between x resolution size 0 -> height 
     lwsl_notice("c:%d width %d height %d\n",c, rw, rh); 
     c++; 
} 

的输出是:

[2016/06/30 09:39:09:7274] NOTICE: c:0 width 606 height 567 
[2016/06/30 09:39:09:7274] NOTICE: c:1 width 606 height 567 
[2016/06/30 09:39:09:7274] NOTICE: c:2 width 606 height 567 
[2016/06/30 09:39:09:7274] NOTICE: c:3 width 606 height 567 
+0

你应该在循环之外使用'srand'并且一次。 – ameyCU

+1

oops更正确的dup是[相同的随机数每个循环迭代](http://stackoverflow.com/q/9251117/995714),[rand()在多个函数调用中是一致的](http://stackoverflow.com/q/29478555/995714),[srand(time(NULL))不会快速更改种子值](http://stackoverflow.com/q/5574914/995714),[srand() - 为什么只调用它一次?](http://stackoverflow.com/q/7343833/995714) –

回答

3

您的循环速度如此之快以致time(NULL)始终具有相同的值。这意味着你的生成器总是从相同的种子开始,所以它总会生成完全相同的值。

srand应该只在程序中调用一次(在for循环之外)。通常,人们从main函数中调用它一次。

5

移动srand((unsigned int)time(NULL));for循环。

+7

这是正确的答案,但你应该解释为什么是这样的情况。 – Michael

+0

这将是有益的,告诉解释在哪里可以确切地被称为和什么是可能的解决方案的利弊。 – gdziadkiewicz

1

在for循环中你初始化array_size,你是用递增循环它,直到i<array_size。那是什么?请张贴更多的代码。

+0

这不是一个答案 – jpo38

+0

它**没有**递增'我'和循环将不会执行一次。无论如何,这不是主要问题,因为即使OP修复了循环,它也无法工作 –