2011-02-12 5 views
0

可能性の重複:このコードで
how to generate different random number in a loop in C++?このコードは、常に同じ数字を生成する乱数を生成するのはなぜですか?

int Randtest(int len) 
{ 
    int test[100]={}; 
    for(int i=0;i<len;i++) 
    { 
     srand (time(NULL)); 
     cout <<(test[i]=rand()%10); 
    } 
} 

int main() 
{ 
Randtest(8); 
} 

出力は常に22222222または11111111のように、繰り返し数のシーケンスになります。 8つの乱数を生成するにはどうしたらいいですか?

+2

この質問は何百万回も聞かれました。正確に重複しています。説明のための – abelenky

答えて

6

あなたのコードに問題はここにある:

for(int i=0;i<len;i++) 
{ 
    srand (time(NULL)); 
    cout <<(test[i]=rand()%10); 
} 

問題は、ループの各反復で、あなたは通常、秒の精度で測定され、現在のシステム時刻とランダマイザを再播種していることです。ランダマイザにシードを渡すたびに、それは返されたランダムな値のシーケンスをリセットします。したがって、同じ値をランダム化したままでシードしておき、再시드するたびにrandを呼び出すと、同じ乱数列を何度も何度もやり直します。システム時間は1秒に1回しか変化しないので、同じ番号のシーケンスが繰り返し生成されます。

、これを修正ここに見られるように、ループの外にsrandへの呼び出しを移動するには:

srand (time(NULL)); 
for(int i=0;i<len;i++) 
{ 
    cout <<(test[i]=rand()%10); 
} 

この道を、あなたは一度だけランダマイザをシードし、ので、あなたの順序は、より多くの擬似ランダムになります。まだいくつかの重複した値が表示されるかもしれませんが、それは決定論的に作用する乱数生成器ではなく、偶然によるものです。

+0

thnx – Abanoub

0

ループの繰り返しごとに同じ値で再シーディングを終了します。ただmainでそれをしてください。

2

srandは、現時点ではtime(NULL)で与えられた乱数発生器を開始します。

ループが非常に速く実行されるため、ループを通過するたびに時間が変わることはなく、乱数ジェネレータを同じ開始点にリセットし続けます。

回答:使用srandONCEと一度だけ、ループ外。

関連する問題