关于srand()和类实现的约定

时间:2014-03-30 14:47:20

标签: c++ random conventions srand

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

我想知道是否有关于在课堂上使用兰德的约定? 像一些函数的宏一样,测试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);

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

2 个答案:

答案 0 :(得分:3)

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

您应该使用C++11 <random> library代替。

Here您可以很好地了解为什么<random>优于rand()

关于你的问题:

你可以简单地将你想要使用的每个随机引擎(例如std::default_radom_engine)与std::random_device一起播种,并且应该保存,或者只使用不同的引擎(可以是相同类型)你的代码的不同部分,每一个都会播种一次。

答案 1 :(得分:2)

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

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

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