2016-07-30 13 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++; 
} 

を使用して、出力は次のようになります。forループのうち

[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 (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

あなたは私がarray_sizeとしてを初期化して、あなたはをインクリメントしi<array_sizeまでそれをループしています。あれは何でしょう?いくつかのコードを投稿してください。

+0

これは答えが – jpo38

+0

ではありません。**なしで**は「i」増分され、ループは1回実行されません。とにかくここでの主な問題ではありません。なぜなら、OPがループを修正しても、とにかく動作しないからです –