背景:我用的是rand()
, std::rand()
, std::random_shuffle()
以及我的代码中用于科学计算的其他函数。为了能够重现我的结果,我总是明确指定随机种子,并通过srand()
。直到最近我才发现 libxml2 也会调用srand()
懒洋洋地第一次使用它——那是在我早年之后srand()
call.
我填写了一个向 libxml2 报告有关其的错误srand() call https://bugzilla.gnome.org/show_bug.cgi?id=738231,但我得到了答案:
然后先初始化libxml2。
这是从图书馆发出的完全合法的呼叫。你应该
没想到没有人打电话srand()
,并且手册页不存在
指出使用srand()
应避免多次
这实际上是我现在的问题。如果一般政策是每个库都可以/应该/将会调用srand()
,我也可以/可能也在这里或那里称呼它,我真的不明白它有什么用处。或者怎么样rand()
那么有用吗?
这就是为什么我认为,一般的(不成文的)政策是任何库都不应该调用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);
也许唯一干净的解决方案是根本不使用它,而只使用我自己的随机生成器(也许通过C++11 <random> http://en.cppreference.com/w/cpp/numeric/random)。但这并不是真正的问题。问题是,谁该打电话srand()
,如果每个人都这样做,情况如何rand()
那么有用吗?