我使用并重复使用rand()
生成的大量序列。为了获得不同的序列,我使用srand()
使用不同但已知的种子。
这种方法有多便携?这是否适用于不同版本的libc,编译器和CPU?
这种方法有更安全的替代方案吗?
只是为了澄清:加密使用
。答案 0 :(得分:4)
您可以保证在特定实现上获得特定种子的相同序列号。您不能保证在不同的实现中为特定种子获得相同的序列。
如果您关心的是序列是可重复的,那么您就是好的。如果您关心实现的顺序是相同的,那么您不是。
答案 1 :(得分:3)
这种方法有多种方式存在缺陷。
它使您的应用程序本身具有单线程。
C标准没有为rand
指定算法,因此它可能因平台和编译器而异。
任何外部(例如GUI)代码都可能意外调用rand
,使您的序列无效。在C ++中,它变得更糟。 Read Compatibility section
标准rand
功能通常被认为不是很好。
对于C ++,请考虑使用<random>
标题中的内容,尤其是Mersenne Twister的某些变体。
对于C,你应该寻找一些实现MT或其他优秀PRNG的库。
如果你想自己实现它,Java Random对于大多数情况来说都足够好并且易于实现。
答案 2 :(得分:0)