使用伪随机生成器生成可重现的大数序列?

时间:2016-06-21 13:03:47

标签: c++ c random numbers

我使用并重复使用rand()生成的大量序列。为了获得不同的序列,我使用srand()使用不同但已知的种子。

这种方法有多便携?这是否适用于不同版本的libc,编译器和CPU?

这种方法有更安全的替代方案吗?

只是为了澄清:加密使用

3 个答案:

答案 0 :(得分:4)

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

如果您关心的是序列是可重复的,那么您就是好的。如果您关心实现的顺序是相同的,那么您不是。

答案 1 :(得分:3)

这种方法有多种方式存在缺陷。

  • 它使您的应用程序本身具有单线程。

  • C标准没有为rand指定算法,因此它可能因平台和编译器而异。

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

  • 标准rand功能通常被认为不是很好。

对于C ++,请考虑使用<random>标题中的内容,尤其是Mersenne Twister的某些变体。

对于C,你应该寻找一些实现MT或其他优秀PRNG的库。

如果你想自己实现它,Java Random对于大多数情况来说都足够好并且易于实现。

答案 2 :(得分:0)

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

  

[...] [注意:此标准中的随机数生成(26.5)工具通常比rand更可取,因为rand的基础算法未指定。因此兰德的使用仍在继续   不可移植,质量和性能无法预测且值得怀疑。 - 结束说明]

因此,标准明确规定使用rand不可移植。标题立即为随机数生成器提供了一系列不同的模板,每个模板都被指定并因此是可移植的。然后由你决定......除了std::default_random_engine之外的所有内容,留给实现再次选择(26.5.5,[10]:

  

备注:此typedef命名的引擎类型的选择是实现定义的。 [...]