我正在使用和重复使用rand()
重新生成的大量序列。为了获得不同的序列,我使用srand()
与不同但已知的种子。生成可重现的大量序列 - 使用伪随机生成器?
这种方法的便携性如何?这将工作在不同版本的libc和编译器和CPU的不同平台上吗?
是否有更安全的替代方法?
只是为了澄清:对于加密使用,这是而不是。
我正在使用和重复使用rand()
重新生成的大量序列。为了获得不同的序列,我使用srand()
与不同但已知的种子。生成可重现的大量序列 - 使用伪随机生成器?
这种方法的便携性如何?这将工作在不同版本的libc和编译器和CPU的不同平台上吗?
是否有更安全的替代方法?
只是为了澄清:对于加密使用,这是而不是。
您可以保证在特定实现中获得特定种子的相同数字序列。您不能保证在不同实现中获得特定种子的相同序列。
如果你所关心的是该序列是可重复的,那么你很好。如果你关心的是实现中的序列是相同的,那么你就不是。
该方法存在多种缺陷。
它使您的应用程序天生就是单线程的。
C标准没有指定rand
的算法,所以它在平台和编译器之间可能会有所不同。
任何外部(例如,GUI)代码都可能会意外地调用rand
,导致序列无效。在C++中,它变得更糟。 Read Compatibility section。
标准rand
函数通常被认为不是很好。
对于C++,可以考虑使用的东西从<random>
头,尤其是一些Mersenne Twister变种。
对于C,您应该寻找一些实现MT或其他良好PRNG的库。
如果你想自己实现它,Java Random既适合大多数情况下,也易于实现。
对于c和更旧的C++的,这似乎是要走的路,对于c + + 11和以上,请参阅http://stackoverflow.com/questions/25644465/fix-seed-globaly-in- c11-random – stefaanv
并检查这一个:http://stackoverflow.com/a/23032503/2703418 – bzeaman
“要获得**不同的**序列我使用srand()与**着名的种子**。” - 恩,你确实看到了矛盾,你呢? – Olaf