случайные числа и множественные звонки
Я пишу программу, которая будет генерировать многочисленные случайные числа в циклах. Я пытаюсь сделать цифры несколько менее предсказуемыми (не только для безопасности, но и для предотвращения столкновений в нескольких потоках).
Я заметил, что многие документы рекомендуют звонитьsrand
только один раз в программе. Например:Случайные числа в Cвыбранный ответ: «Как правило, вызывайте srand () только один раз в вашей программе».
Но почему? Почему было бы так плохо делать что-то вроде этого:
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();
}
}
Таким образом, начальное число изменяется один раз за вызов функции, а не один раз за программу. Таким образом, независимо от того, сколько потоков запущено, никакие два потока не будут иметь одинаковый список случайных чисел ... Верно?
ОБНОВИТЬ Предположим, у меня либо уникальное начальное число для каждого потока, либо мьютекс в глобальном SEED для предотвращения условий гонки.