`rand()` 的用处 - 或者谁应该调用 `srand()`?

2024-03-29

背景:我用的是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()那么有用吗?


使用新的<random>标题代替。它允许多个引擎实例,使用不同的算法,更重要的是,对您来说,独立的种子。

[编辑] 回答“有用”的部分,rand产生random数字。这就是它的好处。如果您需要细粒度的控制(包括再现性),您不仅应该拥有已知的种子,还应该拥有已知的算法。srand充其量给你一个固定的种子,所以这无论如何都不是一个完整的解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

`rand()` 的用处 - 或者谁应该调用 `srand()`? 的相关文章

随机推荐