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

Generate reproducible large number sequences - with pseudo random generator?

本文关键字:随机 发生器      更新时间:2023-10-16

我正在使用并重复使用我(re)使用rand()生成的大数字序列。要获取不同的序列,我使用的是具有不同但已知种子的srand()

这种方法的便携性如何?这会在不同版本的LIBC和Compilers and CPU上使用不同的平台吗?

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

只是为了澄清:这是不是用于加密用法。

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

如果您只关心序列是可重复的,那就很好。如果您在乎整个实现的序列是相同的,那么您不是。

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

  • 它使您的应用程序固有地单线螺纹。

  • c标准未指定rand的算法,因此平台和编译器之间可能会有所不同。

  • 任何外部(例如GUI)代码可以偶然呼叫rand,使您的序列无效。在C 中,情况变得更糟。阅读兼容性部分。

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

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

对于C,您可能应该寻找某些实施MT或其他良好prng的库。

如果您想自己实施,Java随机在大多数情况下都足够好,并且易于实现。

参见C 14标准,26.8.5:C库[C.Math]

[...] [注意:此标准中的随机数(26.5)设施通常比RAND更可取,因为兰德的基础算法未指定。因此,兰德的使用继续 不可预测的质量和性能不可预测。 - 终注]

因此,标准指示可以清楚地指出,使用RAND不可移植。标题立即为随机数生成器提供一系列不同的模板,每种算法被指示并因此是可移植的。然后由您选择...除了std::default_random_engine以外的所有内容,该实现都可以再次选择(26.5.5,[10]:

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