0
srand(time(NULL));
for (it=hand.begin(); it < hand.end(); it++)
    (*it) = rand() % 13 + 1;

このコードは、一度に多数の乱数を作成する場合には機能しません。Mersennesほど複雑ではなく、オペレーティングシステムに依存しない方法はありますか?

4

5 に答える 5

4

PRNGは、一度に多くのPRNを作成することはありません。各出力は前の出力に依存しており、PRNGは非常にステートフルです。

試す:

srand(time(NULL)); // once at the start of the program

for( int i = 0; i < N; ++i )
    r[i] = rand();

1回の関数呼び出しで出力のブロック全体を返すAPIでさえ、そのループを関数内に移動しただけです。

于 2011-04-16T17:19:50.930 に答える
2

srandプログラムの開始時に一度だけ呼び出します。rand()次に(ではなく )を呼び出しsrand(rand())て、各乱数を生成します。

于 2011-04-16T17:20:25.750 に答える
1

Boost.Randomには、使いやすい優れた乱数ジェネレーターがたくさんあります。

于 2011-04-16T17:20:11.830 に答える
0

「必ず質問に答えてください」OK

for (int i=n1; i < n2; ++i)
  { 
  int k; 
  do k = rand(); while (i !=k); 
  // k is a sequential pseudo random number
  }

効率に問題があるかもしれません...

于 2011-04-16T21:15:54.413 に答える
0

George Marsagliaは、しばらく前にsci.mathにMultiply WithCarryPRNGを投稿しました。

それがどれほど優れているか、またはそれがどれほどうまく動作するかは言えませんが、試してみることをお勧めします。

OSやプラットフォームに依存しない必要があります。

于 2011-04-16T17:30:01.633 に答える