ループで多数の乱数を生成するプログラムを書いています。数値を予測しにくいものにしようとしています (セキュリティのためだけでなく、複数のスレッドでの衝突を避けるため)。
srand
多くのドキュメントが、プログラム内で 1 回だけ呼び出すことを推奨していることに気付きました。例: C の乱数。選択された答えは、「原則として、プログラムで srand() を 1 回だけ呼び出す」です。
しかし、なぜ?このようなことをするのはなぜそんなに悪いのでしょうか:
int THIS_THREAD_SEED;
int randomness() {
++THIS_THREAD_SEED;
int i;
for(i=0 i<1000; i++) {
unsigned n = rand_r(&THIS_THREAD_SEED) / RAND_MAX;
/* do something with n */
}
return 0;
}
int do_something() {
int i;
for(i=0; i<1000; i++) {
randomness();
}
}
そのため、シードはプログラムごとではなく、関数呼び出しごとに 1 回変更されます。このように、実行中のスレッドの数に関係なく、2 つのスレッドがすべて同じ乱数リストを持つことはありません。
更新 各スレッドに一意のシードがあるか、競合状態を防ぐためにグローバル SEED にミューテックスがあるとします。