0

重複の可能性:
C ++のループで異なる乱数を生成する方法は?

これは私のコードです:

 for(i=0;i<10;i++)
 {
    srand ( time(NULL) );
    cout<<time(NULL);
    max=100,min=0;
    for(j=0;j<3;j++)
    {
          cout<<(( (rand() % (max - min + 1)) + min)%5);
    }
 }

今、私は出力を取得します:

1357207288 0 1 4

1357207289 0 1 4

1357207290 0 1 4

等々。毎回違う乱数を出したいです。どうすればこれを達成できますか。

4

4 に答える 4

3

srand()ループの外に移動する必要があります。そうしないと、同じ番号を受け取ります。

srand ( time(NULL) );
for(i=0;i<10;i++)
{
cout<<time(NULL);
max=100,
for(j=0;j<3;j++)
{
      cout<<(( (rand() % (max - min + 1)) + min)%5);
}
}

そうしないと、プログラムの実行にかかるナノ秒単位で時間が変わらないため、同じシードを使用します。

于 2013-01-03T10:11:33.273 に答える
1
srand(time(NULL));
printf("%d", rand() % 10+1);
for(i=1; i<rand()% max_length; i++) {
  printf("%ld", rand() % 10);
}

これにより、乱数(およびそれらのランダムな長さ)が生成されます。

于 2013-01-03T10:08:35.067 に答える
1

C では、rand によって使用される生成アルゴリズムは、この関数の呼び出しによってのみ進められることが保証されているため、ループの外で srand() を使用しても同じ結果が得られます。C++ では、この制約が緩和され、ライブラリの実装によって、他の状況 ( の要素への呼び出しなど<random>) でジェネレータを進めることができます。ループ内にスリープを入れて、何が起こるか見てみましょう。

明らかにプレーン C では、これは起こりません。ただし、ブースト ライブラリは優れた PRNG 機能を提供します。壊れた代わりに使うsrand(time(NULL));

于 2013-01-03T10:15:04.407 に答える