Справочная информация. Я использую 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() полезно тогда?