Справочная информация. Я использую rand()
, std::rand()
, std::random_shuffle()
и другие функции в моем коде для научных вычислений. Чтобы иметь возможность воспроизводить мои результаты, я всегда четко указываю случайное семя и устанавливаю его через srand()
. Это было хорошо до недавнего времени, когда я понял, что libxml2 также будет лгать srand()
при первом использовании - это было после моего раннего вызова srand()
.
Я заполнил отчет об ошибке в libxml2 о его вызове srand()
, но я получил ответ:
Сначала инициализируйте libxml2. Это совершенно законный вызов, который должен быть сделан из библиотеки. Вам следует не ожидайте, что никто не называет
srand()
, а man-страница нигде заявляет, что следует избегать использованияsrand()
нескольких времен
На самом деле это мой вопрос. Если общая политика заключается в том, что каждый lib может/должен/должен/будет вызывать srand()
, и я могу/мог бы также называть его здесь и там, я действительно не вижу, как это может быть полезно вообще. Или как rand()
полезно тогда?
Вот почему я думал, что общая (неписаная) политика заключается в том, что lib никогда не должен называть srand()
, и приложение должно называть его только один раз в начале. (Не принимая во внимание многопоточность. Думаю, в этом случае вы все равно должны использовать что-то другое.)
Я также попытался исследовать бит, который другие библиотеки на самом деле называют srand()
, но я не нашел его. Есть ли?
Моим текущим обходным решением является этот уродливый код:
{
// On the first call to xmlDictCreate,
// libxml2 will initialize some internal randomize system,
// which calls srand(time(NULL)).
// So, do that first call here now, so that we can use our
// own random seed.
xmlDictPtr p = xmlDictCreate();
xmlDictFree(p);
}
srand(my_own_seed);
Вероятно, единственным чистым решением было бы не использовать это вообще и использовать только мой собственный случайный генератор (возможно, через С++ 11 <random>
). Но на самом деле это не вопрос. Вопрос в том, кто должен вызывать srand()
, а если все это делают, то как rand()
полезно тогда?