2016-07-30 126 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修復了循環,它也無法工作 –