2016-06-21 52 views
0

我正在使用和重复使用rand()重新生成的大量序列。为了获得不同的序列,我使用srand()与不同但已知的种子。生成可重现的大量序列 - 使用伪随机生成器?

这种方法的便携性如何?这将工作在不同版本的libc和编译器和CPU的不同平台上吗?

是否有更安全的替代方法?

只是为了澄清:对于加密使用,这是而不是

+0

对于c和更旧的C++的,这似乎是要走的路,对于c + + 11和以上,请参阅http://stackoverflow.com/questions/25644465/fix-seed-globaly-in- c11-random – stefaanv

+0

并检查这一个:http://stackoverflow.com/a/23032503/2703418 – bzeaman

+0

“要获得**不同的**序列我使用srand()与**着名的种子**。” - 恩,你确实看到了矛盾,你呢? – Olaf

回答

4

您可以保证在特定实现中获得特定种子的相同数字序列。您不能保证在不同实现中获得特定种子的相同序列。

如果你所关心的是该序列是可重复的,那么你很好。如果你关心的是实现中的序列是相同的,那么你就不是。

3

该方法存在多种缺陷。

  • 它使您的应用程序天生就是单线程的。

  • C标准没有指定rand的算法,所以它在平台和编译器之间可能会有所不同。

  • 任何外部(例如,GUI)代码都可能会意外地调用rand,导致序列无效。在C++中,它变得更糟。 Read Compatibility section

  • 标准rand函数通常被认为不是很好。

对于C++,可以考虑使用的东西从<random>头,尤其是一些Mersenne Twister变种。

对于C,您应该寻找一些实现MT或其他良好PRNG的库。

如果你想自己实现它,Java Random既适合大多数情况下,也易于实现。

0

见C++ 14标准,26.8.5:C库[c.math]

[...] [注:在本标准中的随机数生成(26.5)设施通常比rand更好,因为rand的底层算法是未指定的。因此使用兰特继续 是不可移植的,具有不可预知的和质疑和质量问题的性能。 - 尾注]

因此,标准清楚地指出,使用rand不是便携式的。标题为随机数发生器提供了一系列不同的模板,每个算法都是口授的,因此是便携式的。然后由您来选择......所有但std::default_random_engine,这是留给实现再次选择(26.5.5,[10]:

备注:此类型定义命名的发动机类型的选择是实现定义[... ]