srand(time(NULL));
for (it=hand.begin(); it < hand.end(); it++)
(*it) = rand() % 13 + 1;
このコードは、一度に多数の乱数を作成する場合には機能しません。Mersennesほど複雑ではなく、オペレーティングシステムに依存しない方法はありますか?
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でさえ、そのループを関数内に移動しただけです。
srand
プログラムの開始時に一度だけ呼び出します。rand()
次に(ではなく )を呼び出しsrand(rand())
て、各乱数を生成します。
Boost.Randomには、使いやすい優れた乱数ジェネレーターがたくさんあります。
「必ず質問に答えてください」OK
for (int i=n1; i < n2; ++i)
{
int k;
do k = rand(); while (i !=k);
// k is a sequential pseudo random number
}
効率に問題があるかもしれません...
George Marsagliaは、しばらく前にsci.mathにMultiply WithCarryPRNGを投稿しました。
それがどれほど優れているか、またはそれがどれほどうまく動作するかは言えませんが、試してみることをお勧めします。
OSやプラットフォームに依存しない必要があります。