【问题标题】:convention regarding srand() and class implementation关于 srand() 和类实现的约定
【发布时间】:2014-03-30 14:47:20
【问题描述】:

我知道最好只调用 srand() 一次(否则,如果使用相同的种子调用,您可能会得到相似的序列)。 现在,我正在实现一个将在其他代码中使用的类(可能不是我的),所以我无法访问 main()。

我想知道关于在类中使用 rand 是否有任何约定? 就像一些测试 srand 是否已经被调用的函数宏一样(如果没有,则将其调用到构造函数或其他东西中)。 还是我只是相信将要使用它的人在 main() 的开头调用 srand() ? 谢谢,

编辑@Malloc:

谢谢,如果我理解正确,我将不得不使用这种类型的初始化:

std::random_device r_device; 
std::default_random_engine r_engine (r_device());
std::uniform_real_distribution<double> uniform_noise (a,b); 

然后我可以调用实现:

uniform_noise(r_engine);

播种不是在当前时间完成的吗? 因此,我可以例如在构造函数中进行初始化并将引擎和分发作为私有成员?

【问题讨论】:

  • 在没有 C++11 库的情况下,您可以使用 POSIX drand48() 集合中的一些函数来为不同的随机数序列提供不同的种子和状态,从而为您提供有机会在很大程度上将您的代码的随机数生成与其他任何人的代码隔离开来。

标签: c++ random conventions srand


【解决方案1】:

在现代 C++ 中,不建议使用 rand()srand()

您应该改用C++11 &lt;random&gt; library

Here 你可以很好地了解为什么&lt;random&gt;rand() 更好。

关于你的问题:

您可以简单地用std::random_device 播种您想要使用的每个随机引擎(例如std::default_radom_engine)并且应该保存在任何地方,或者只是在不同部分使用不同的引擎(可以是相同类型)您的代码并为它们中的每一个播种一次。

【讨论】:

  • 谢谢,所以如果我理解正确,我将不得不使用这种类型的初始化: std::random_device r_device std::default_random_engine r_engine (rd); std::uniform_real_distribution uniform_noise (a,b);然后我可以调用实现:uniform_noise(r_engine);
  • @Demod 看起来是正确的。您可以随时查看我链接到的参考示例以确定。
【解决方案2】:

这可能属于“记录它”类别。显然,在库中的某个位置调用 srand() 可能会阻止其他代码按预期工作。因此,如果您的代码依赖于被调用的srand,那么您需要在文档中说明您希望调用者的代码在使用您的函数之前调用srand

据我所知,没有办法检查srand 是否确实被调用过。

如果您对环境有限制,可能还有其他解决方案。例如,在 glibc 的 randsrand 中,您可以使用 rand_r,它带有指向 seed 变量的指针 - 这样您就可以拥有完全独立的随机数序列,这不依赖于外部“帮助” .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多